您的位置:首页 > 其它

poj 1436 Horizontally Visible Segments(线段树)

2014-07-04 15:09 351 查看
poj 1436 Horizontally Visible Segments

太暴力了、、

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 8005
#define lch p<<1
#define rch p<<1|1
#define mid (t[p].l+t[p].r)>>1
struct node
{
int l,r;
int c,flag;
}t[MAXN<<3];
struct segment
{
int x,yd,yu;
bool operator < (const segment &a) const
{
return x<a.x;
}
}s[MAXN];
bool map[MAXN][MAXN];
void construct(int l,int r,int p)
{
t[p].l=l,t[p].r=r,t[p].c=-1,t[p].flag=0;
if(l==r) return ;
int m=mid;
construct(l,m,lch);
construct(m+1,r,rch);
}
void pushdown(int p)
{
t[lch].c=t[rch].c=t[p].c;
t[p].c=-1;
}
void modify(int l,int r,int c,int p)
{
if(t[p].l>=l&&t[p].r<=r)
{
t[p].c=c;
return ;
}
if(t[p].l==t[p].r) return ;
if(t[p].c!=-1) pushdown(p);
if(l<=t[lch].r) modify(l,r,c,lch);
if(r>=t[rch].l) modify(l,r,c,rch);
}
void query(int l,int r,int c,int p)
{
if(t[p].c!=-1)
{
map[t[p].c][c]=true;
return ;
}
if(t[p].l==t[p].r) return ;
if(t[p].c!=-1) pushdown(p);
if(l<=t[lch].r) query(l,r,c,lch);
if(r>=t[rch].l) query(l,r,c,rch);
}
int main()
{
int cas,n;
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&n);
int ydd=1<<30,yuu=0;
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&s[i].yd,&s[i].yu,&s[i].x);
s[i].yd<<=1;
s[i].yu<<=1;
if(s[i].yd<ydd) ydd=s[i].yd;
if(s[i].yu>yuu) yuu=s[i].yu;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
map[i][j]=false;
construct(ydd,yuu,1);
sort(s,s+n);
for(int i=0;i<n;i++)
{
query(s[i].yd,s[i].yu,i,1);
modify(s[i].yd,s[i].yu,i,1);
}
int ans=0;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
if(map[i][j])
for(int k=j+1;k<n;k++)
if(map[i][k]&&map[j][k])
ans++;
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线段树