做了大概四个小时,还是参考的别人的,最终才搞定,感觉这题坑太多。
开始建树的时候按照给的n建的树,后来仔细想了下,这错的离谱,这是我的锅,,然后染色的时候,如果给的是x1,x2,c,更新时应该x1+1,x2,c,比如0,4,4,0到4染色4段,也就是染色1到4这四个点。。。在计算某个颜色出现的次数的时候,计算的是颜色段的个数,我起初算的竟然是长度,我的锅。。。。
代码是在vjudge上参考的一个别人提交的公开的代码。。
#include <cstdio>
#include <cstring>
const int MAXN = 8005;
struct node
{
int l,r,col;
};
node segTree[MAXN<<2];
int color[MAXN];
void buildTree(int t, int l, int r)
{
segTree[t].l = l;
segTree[t].r = r;
segTree[t].col = -1;
if(l == r) return;
int mid = (l+r)/2;
buildTree(t<<1,l,mid);
buildTree(t<<1|1,mid+1,r);
}
void pushDown(int t)
{
segTree[t<<1].col = segTree[t<<1|1].col = segTree[t].col;
segTree[t].col = -1;
}
void update(int t,int l, int r, int col)
{
if(l <= segTree[t].l && r >= segTree[t].r)
{
segTree[t].col = col;
return;
}
if(segTree[t].col != -1)
pushDown(t);
int mid = (segTree[t].l+segTree[t].r) >> 1;
if(r <= mid)
update(t<<1,l,r,col);
else if(l > mid)
update(t<<1|1,l,r,col);
else
{
update(t<<1,l,mid,col);
update(t<<1|1,mid+1,r,col);
}
if(segTree[t<<1].col == segTree[t<<1|1].col && segTree[t<<1].col != -1)
segTree[t].col = segTree[t<<1].col;
}
void query(int t)
{
if(segTree[t].col != -1)
{
//染色
for(int i = segTree[t].l; i <= segTree[t].r; ++i)
color[i] = segTree[t].col;
return;
}
if(segTree[t].l == segTree[t].r) return;
query(t<<1);
query(t<<1|1);
}
void ans()
{
int res[MAXN];
memset(res,0,sizeof(res));
int pre = -1,i;
for(i = 0; i < MAXN; ++i)
if(pre != color[i])
{
pre = color[i];
res[pre]++;
}
for(i = 0; i < MAXN; ++i)
if(res[i] != 0)
printf("%d %d\n",i,res[i]);
printf("\n");
}
int main()
{
int n,a,b,c;
while(scanf("%d",&n) != EOF)
{
memset(color,-1,sizeof(color));
buildTree(1,0,MAXN);
for(int i = 0; i < n; ++i)
{
scanf("%d %d %d",&a,&b,&c);
update(1,a+1,b,c);
}
query(1);
ans();
}
return 0;
}