POJ-1436 Horizontally Visible Segments
Description
There is a number of disjoint vertical line segments in the plane. we say that two segments are horizontally visible if they can be connected by a horizontal line segment that does not have any common points with other vertical segments. three different vertical segments are said to form a triangle of segments if each two of them are horizontally visible. how many triangles can be found in a given Set of vertical segments?
Task
Write a program which for each data set:
Reads the description of a set of vertical segments,
Computes the number of triangles in this set,
Writes the result.
Input
The first line of the input contains exactly one positive integer d equal to the number of data sets, 1 <= d <= 20. The data sets follow.
The first line of each data set contains exactly one integer n, 1 <= n <= 8 000, equal to the number of vertical line segments.
Each of the following n lines consists of exactly 3 nonnegative integers separated by single spaces:
Yi ', yi '', xi-y-coordinate of the beginning of a segment, y-coordinate of its end and its x-coordinate, respectively. the coordinates satisfy 0 <= yi' <yi'' <= 8 000, 0 <= xi <= 8 000. the segments are disjoint.
Output
The output shoshould consist of exactly d lines, one line for each data set. Line I shoshould contain exactly one integer equal to the number of triangles in the I-th data set.
Sample Input
150 4 40 3 13 4 20 2 20 2 3
Sample Output
1
There are several vertical lines on the plane. If there is a line between the two vertical lines that will not pass through other vertical lines, so we can say that these two lines are mutually visible.
Idea: To solve the coverage problem, we first sort the problem and find out whether there is a visible solution before, which will not affect the result, because the visualization is mutual,
Then, because the Unit of the Line Segment tree is a line segment rather than a point, we need to overwrite the null distance between two adjacent points by setting the value * 2.
#include
#include
#include #include
#include
#define lson(x) ((x) << 1)#define rson(x) ((x) << 1 | 1)using namespace std;const int maxn = 8005<<1;vector
ve[maxn<<1];int vis[maxn<<1];struct seg {int w;};struct segment_tree {seg node[maxn<<2];void build() {memset(node, -1, sizeof(node));}void push(int pos) {if (node[pos].w != -1) {node[lson(pos)].w = node[rson(pos)].w = node[pos].w;node[pos].w = -1;}}void modify(int l, int r, int pos, int x, int y, int z) {if (x <= l && y >= r) {node[pos].w = z;return;}push(pos);int m = l + r >> 1;if (x <= m)modify(l, m, lson(pos), x, y, z);if (y > m)modify(m+1, r, rson(pos), x, y, z);}void query(int l, int r, int pos, int x, int y, int z) {if (node[pos].w != -1) {if (!vis[node[pos].w]) {vis[node[pos].w] = 1;ve[z].push_back(node[pos].w);}return;}if (l == r)return;int m = l + r >> 1;if (x <= m)query(l, m, lson(pos), x, y, z);if (y > m)query(m+1, r, rson(pos), x, y, z);}} tree;struct segment {int a, b, x;bool operator <(const segment &tmp) const {return x < tmp.x;}} a[maxn];int main() {int t, n;scanf("%d", &t);while (t--) {scanf("%d", &n);int l = 0x3f3f3f3f, r = -1;for (int i = 0; i < n; i++) {scanf("%d%d%d", &a[i].a, &a[i].b, &a[i].x);a[i].a *= 2;a[i].b *= 2;}sort(a, a+n);tree.build();for (int i = 0; i < n; i++)ve[i].clear();for (int i = 0; i < n; i++) {memset(vis, 0, sizeof(vis));tree.query(0, maxn<<1, 1, a[i].a, a[i].b, i);tree.modify(0, maxn<<1, 1, a[i].a, a[i].b, i);}int ans = 0;for (int i = 0; i < n; i++) {int cnt = i;for (int j = 0; j < ve[cnt].size(); j++) {int cur = ve[cnt][j];for (int k = 0; k < ve[cur].size(); k++) for (int l = 0; l < ve[cnt].size(); l++)if (ve[cur][k] == ve[cnt][l])ans++;}}printf("%d\n", ans);}return 0;}