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;
}
太暴力了、、
#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;
}
相关文章推荐
- POJ 1436——Horizontally Visible Segments(线段树,区间染色+暴力+简单hash)
- poj1436 Horizontally Visible Segments 线段树成段更新
- POJ 1436 Horizontally Visible Segments(线段树区间更新)
- poj 1436 Horizontally Visible Segments(线段树基础,区间染色,拆点)
- POJ 题目1436 Horizontally Visible Segments(线段树染色覆盖求相互是否可见)
- POJ 1436 Horizontally Visible Segments(线段树区间染色查询)
- POJ 1436 Horizontally Visible Segments(线段树区间染色问题)
- POJ 1436 Horizontally Visible Segments 线段树 成段更新
- poj 1436 Horizontally Visible Segments(线段树)
- POJ 1436 Horizontally Visible Segments 线段树
- POJ 1436 Horizontally Visible Segments (线段树+区间覆盖)
- POJ 1436 Horizontally Visible Segments (线段树水过)
- poj 1436 Horizontally Visible Segments(线段树、区间覆盖)
- POJ 1436 Horizontally Visible Segments(线段树)
- POJ 1436 Horizontally Visible Segments(线段树区间修改)
- POJ 1436 Horizontally Visible Segments(线段树)
- POJ 1436 Horizontally Visible Segments 线段树 成段更新
- POJ 1436 Horizontally Visible Segments (线段树)
- poj 1436 线段树 Horizontally Visible Segments
- poj 1436 Horizontally Visible Segments - 线段树区间更新