#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std;
#define maxn 8100
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
int tree[maxn<<3];
vector<int>mark[maxn];
int lab[maxn<<3];
struct node
{
int x,l,r;
}s[maxn];
bool cmp(node aa,node bb)
{
return aa.x<bb.x;
}
void pushdown(int rt)
{
if(tree[rt]!=-1)
{
tree[rt<<1]=tree[rt<<1|1]=tree[rt];
tree[rt]=-1;
}
}
void update(int rt,int l,int r,int x,int y,int val)
{
if(x<=l&&y>=r)
{
tree[rt]=val;
return;
}
pushdown(rt);
int m=(l+r)>>1;
if(x<=m)
{
update(lson,x,y,val);
}
if(y>m)
{
update(rson,x,y,val);
}
}
void query(int rt,int l,int r,int x,int y,int val)
{
if(tree[rt]!=-1)
{
if(lab[tree[rt]]!=val)
{
mark[val].push_back(tree[rt]);
lab[tree[rt]] = val;
}
return;
}
if(l==r) return;
pushdown(rt);
int m=(l+r)>>1;
if(x<=m)
query(lson,x,y,val);
if(y>m)
query(rson,x,y,val);
}
int main()
{
int cas,n,m,q;
int x,y,z,a,b,c;
scanf("%d",&cas);
while(cas--)
{
for(int i=0;i<maxn;i++)
mark[i].clear();
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&s[i].l,&s[i].r,&s[i].x);
s[i].l*=2;
s[i].r*=2;
}
sort(s,s+n,cmp);
memset(tree,-1,sizeof(tree));
memset(lab, -1, sizeof(lab));
for(int i=0;i<n;i++)
{
query( 1 , 0 , maxn<<1 ,s[i].l , s[i].r , i);
update( 1 , 0 , maxn<<1 , s[i].l , s[i].r , i);
}
int ret = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < mark[i].size(); j++)
{
int t = mark[i][j];
for (int k = 0; k < mark[i].size(); k++)
for (int m = 0; m < mark[t].size(); m++)
if (mark[i][k] == mark[t][m])
++ret;
}
printf("%d\n", ret);
}
return 0;
}
poj1436 Horizontally Visible Segments 线段树成段更新
最新推荐文章于 2019-08-29 09:56:50 发布