您的位置:首页 > 大数据 > 人工智能

1019.Line Painting(线段树 离散化)

2013-09-23 13:25 316 查看
1019

离散化都忘记怎么写了 注意两个端点 离散化后用线段树更新区间 混色为-1 黑为2 白为1 因为N不大 最后直接循环标记这一段的颜色查找

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define N 100010
#define LL long long
struct node
{
int d,id;
char c;
}li[N<<1];
int q
[3],pp
;
int s[N<<2],cnt
,cc
;
void build(int l,int r,int w)
{
s[w] = 1;
if(l==r-1)
{
return ;
}
int m = (l+r)>>1;
build(l,m,w<<1);
build(m,r,w<<1|1);
}
void update(int a,int b,int d,int l,int r,int w)
{
if(a<=l&&b>=r)
{
s[w] = d;
return ;
}
if(l==r-1)
return ;
if(s[w]>0&&s[w]!=d)
{
s[w<<1] = s[w<<1|1] = s[w];
s[w] = -1;
}
int m = (l+r)>>1;
if(a<=m)
update(a,b,d,l,m,w<<1);
if(b>m)
update(a,b,d,m,r,w<<1|1);
}
void query(int l,int r,int w)
{
int i;
if(s[w]>0)
{
for(i = l ; i < r; i++)
cnt[i] = s[w];
return ;
}
if(l==r-1)
return ;
int m = (l+r)>>1;
query(l,m,w<<1);
query(m,r,w<<1|1);
}
bool cmp(node a,node b)
{
return a.d<b.d;
}
int main()
{
int i,n;
char c[10];
scanf("%d",&n);
for(i = 0 ; i < n ; i++)
{
scanf("%d%d%s",&q[i][0],&q[i][1],c);
if(c[0]=='b')
cc[i+1] = 2;
else
cc[i+1] = 1;
li[2*i].d = q[i][0];
li[2*i].id = -(i+1);
li[2*i+1].d = q[i][1];
li[2*i+1].id = i+1;
}
sort(li,li+2*n,cmp);
int tt = li[0].d,g=1;
for(i = 0 ; i < 2*n ; i++)
{
if(li[i].d!=tt)
{
g++;
tt = li[i].d;
}
if(li[i].id<0)
{
q[-li[i].id][0] = g;
pp[g] = li[i].d;
}
else
{
q[li[i].id][1] = g;
pp[g] = li[i].d;
}
}
build(0,g,1);
for(i = 0; i <= g ; i++)
cnt[i] = 1;
for(i = 1 ; i <= n ; i++)
{
update(q[i][0],q[i][1],cc[i],0,g,1);
}
query(0,g,1);
int maxz=0,ss,ee,ts,te;
cnt[0] = 1;
cnt[g+1] = 1;
pp[g+1] = 1000000000;
for(i = 0 ; i <= g ; i++)
{
if(cnt[i]!=1)
continue;
ss = pp[i];
while(cnt[i]==1&&i<=g)
i++;
ee = pp[i];
if(ee-ss+1>maxz)
{
ts = ss;
te = ee;
maxz = ee-ss+1;
}
}
printf("%d %d\n",ts,te);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: