题意:
。。。
思路:
首先按x排序,,
然后一条一条覆盖上去,当前为i,如果可以同时看到x和y,且x和y互相能看到,答案加1。。
统计的部分暴力就能ac。。
关键点:相邻整数之间的部分被当作看不见了。。不如x相同的两条
(1, 2) (3, 3)…(2, 3)之间其实是可以看过去的,所以要拆点。
int xi[Maxn], y1i[Maxn], y2i[Maxn], rk[Maxn];
bool ma[Maxn][Maxn];
#define lson(x) ((x)<<1)
#define rson(x) (((x)<<1)|1)
struct node {
int cover;
};
node a[Maxn*8+5];
void push_down(int o) {
if (a[o].cover != -1) {
a[lson(o)].cover = a[rson(o)].cover = a[o].cover;
a[o].cover = -1;
}
}
set<int> s;
void seg_update(int L, int R, int o, int qL, int qR, int v) {
int lc = lson(o), rc = rson(o), mid = (L+R)>>1;
if (qL <= L && R <= qR) {
if (a[o].cover != -1) {
if (xi[a[o].cover] != xi[v]) s.insert(a[o].cover);
} else {
if (L < R) {
seg_update(L, mid, lc, qL, qR, v);
seg_update(mid+1, R, rc, qL, qR, v);
}
}
a[o].cover = v;
return;
}
push_down(o);
if (qL <= mid) seg_update(L, mid, lc, qL, qR, v);
if (qR > mid) seg_update(mid+1, R, rc, qL, qR, v);
}
void seg_build(int L, int R, int o) {
a[o] = (node) {-1};
if (L == R) {
int kk = 0;
++kk;
}
if (L < R) {
int lc = lson(o), rc = rson(o), mid = (L+R)>>1;
seg_build(L, mid, lc);seg_build(mid+1, R, rc);
}
}
int calc(int x) {
if (s.empty()) return 0;
vector<int> v;
set<int>::iterator it = s.begin();
for (;it != s.end();++it) {
v.push_back(*it);
ma[x][*it] = ma[*it][x] = 1;
}
//printf("%d can see: ", x);for (int i=0;i<v.size();++i) printf("%d ", v[i]);printf("\n");
int sz = v.size(), ret = 0;
rep(i, 0, sz-1) rep(j, i+1, sz-1) if (ma[v[i]][v[j]]) ++ret;
return ret;
}
bool cmp(int lhs, int rhs) {
return xi[lhs] < xi[rhs];
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input.in", "r", stdin);
#endif // ONLINE_JUDGE
int t, n, N = 2*Maxn;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
seg_build(1, N, 1);
memset(ma, 0, sizeof(ma));
rep(i, 1, n) {
scanf("%d%d%d", &y1i[i], &y2i[i], &xi[i]);
y1i[i] *= 2;y2i[i] *= 2;
++y1i[i];++y2i[i];
rk[i] = i;
}
sort(rk+1, rk+1+n, cmp);
int ans = 0;
rep(i, 1, n) {
int x = rk[i];
//printf("dye%d: (%d %d) %d:\n", x, y1i[x], y2i[x], xi[x]);
s.clear();
seg_update(1, N, 1, y1i[x], y2i[x], x);
ans += calc(x);
}
printf("%d\n", ans);
}
return 0;
}