1、给了每条线段的颜色,存在颜色覆盖,求表面上能够看到的颜色种类以及每种颜色的段数。

2、线段树区间更新,单点查询。

但是有点细节,比如:

输入:

2

0 1 1

2 3 1

输出:

1 2

这种情况如果不处理,那么由于是检查点的颜色,会检查到0,1,2,3的颜色都为1,认为是一段连续的,就会输出 1 1

需要处理一下,代码中把所有的左端点都+1,避免了这种情况,比较巧妙。

3、

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std; #define L(root) ((root) << 1)
#define R(root) (((root) << 1) + 1) const int MAXN = ; struct st
{
// 区间范围
int left, right;
int flag;//-1没有颜色
} st[MAXN * ];
int color[MAXN];//每种颜色看到的段数
// 建树代码基本不变
void build(int root, int l, int r)
{
st[root].left = l, st[root].right = r, st[root].flag = -;
if (l == r)
{
return;
} int m = l + ((r - l) >> );
build(L(root), l, m);
build(R(root), m + , r);
} int query(int root, int x)//单点查询
{
if (st[root].left == st[root].right)
{
return st[root].flag;
} // 否则需将当前区间的“缓冲”值更新下去并修正各节点区间的总和
if (st[root].flag!=-)
{
st[L(root)].flag = st[root].flag;
st[R(root)].flag = st[root].flag;
st[root].flag = -;
} int m = st[root].left + ((st[root].right - st[root].left) >> );
if (x <= m)
{
return query(L(root), x);
}
else
{
return query(R(root), x);
}
} void update(int root, int l, int r, int v)//区间更新
{
// 如变更区间恰等于节点区间,只修正当前节点区间即可
if (st[root].left == l && st[root].right == r)
{
st[root].flag = v;
return;
} // 否则需向下修正相关节点区间
if (st[root].flag!=-)
{
st[L(root)].flag = st[root].flag;
st[R(root)].flag = st[root].flag;
st[root].flag = -;
} int m = st[root].left + ((st[root].right - st[root].left) >> );
if (r <= m)
{
update(L(root), l, r, v);
}
else if (l > m)
{
update(R(root), l, r, v);
}
else
{
update(L(root), l, m, v);
update(R(root), m + , r, v);
}
} int main()
{
int n,i;
int x1,x2,c;
int lastColor;//记录上一个颜色
int nowColor;//当前颜色
while(~scanf("%d",&n)){
build(,,);
for(i=;i<=n;++i){
scanf("%d%d%d",&x1,&x2,&c);
update(,++x1,x2,c);//++x1表示缩掉前面一点,处理了0 1 1,2 3 1这种情况,而且还符合了左端点从1开始
}
memset(color,,sizeof(color));
lastColor=-;
for(i=;i<=;++i){
nowColor=query(,i);
if(nowColor==lastColor)
continue;
else if(nowColor!=-)
++color[nowColor];
lastColor=nowColor;
}
for(i=;i<=;++i)//颜色标号是0~8000
if(color[i])
printf("%d %d\n",i,color[i]);
printf("\n");
}
return ;
}

c2.这个没有用上面的左端点+1,但是在建树的时候是用的[0,1],[1,2],[2,3],类似这样的建树,比较刁

上面的建树是[0,1],[2,3],类似这样的,还是有点区别的。具体看代码吧。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=;
struct Node
{
int l,r;
int color;
}segTree[MAXN*];
int color[MAXN];
int temp;
void Build(int i,int l,int r)
{
segTree[i].l=l;
segTree[i].r=r;
segTree[i].color=-;//-1表示没有颜色
if(l+==r)return;
int mid=((l+r)>>);
Build(i<<,l,mid);
Build((i<<)|,mid,r);
}
void insert(int i,int l,int r,int c)
{
if(l==r)return;
if(segTree[i].color==c)return;
if(l<=segTree[i].l&&r>=segTree[i].r)
{
segTree[i].color=c;
return;
}
if(segTree[i].color>=)//存在颜色,往下更新
{
segTree[i<<].color=segTree[i].color;
segTree[(i<<)|].color=segTree[i].color;
segTree[i].color=-;//表示有多种颜色
}
int mid=((segTree[i].l+segTree[i].r)>>);
if(r<=mid) insert(i<<,l,r,c);
else if(l>=mid) insert((i<<)|,l,r,c);
else
{
insert(i<<,l,mid,c);
insert((i<<)|,mid,r,c);
}
segTree[i].color=-;
}
void Count(int i)//统计各颜色的段数
{
if(segTree[i].color==-)
{
temp=-;
return;
}
if(segTree[i].color!=-)
{
if(segTree[i].color!=temp)//temp存的是前一段的颜色
{
color[segTree[i].color]++;
temp=segTree[i].color;
}
return;
}
if(segTree[i].l+!=segTree[i].r)
{
Count(i<<);
Count((i<<)|);
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,a,b,c;
int Max;
while(scanf("%d",&n)!=EOF)
{
Build(,,);
Max=;
while(n--)
{
scanf("%d%d%d",&a,&b,&c);
insert(,a,b,c);
if(c>Max)Max=c;
}
temp=-;
memset(color,,sizeof(color));
Count();
for(int i=;i<=Max;i++)
{
if(color[i])printf("%d %d\n",i,color[i]);
}
printf("\n");
}
return ;
}

ZOJ - 1610 Count the Colors(线段树区间更新,单点查询)的更多相关文章

  1. ZOJ 1610 Count the Colors(线段树,区间覆盖,单点查询)

    Count the Colors Time Limit: 2 Seconds      Memory Limit: 65536 KB Painting some colored segments on ...

  2. zoj 1610 Count the Colors 线段树区间更新/暴力

    Count the Colors Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/show ...

  3. ZOJ 1610 Count the Color(线段树区间更新)

    描述Painting some colored segments on a line, some previously painted segments may be covered by some ...

  4. 【POJ 2777】 Count Color(线段树区间更新与查询)

    [POJ 2777] Count Color(线段树区间更新与查询) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4094 ...

  5. HDU.1556 Color the ball (线段树 区间更新 单点查询)

    HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...

  6. ZOJ 1610 Count the Colors【题意+线段树区间更新&&单点查询】

    任意门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610 Count the Colors Time Limit: 2 ...

  7. ZOJ 1610 Count the Colors (线段树成段更新)

    题意 : 给出 n 个染色操作,问你到最后区间上能看见的各个颜色所拥有的区间块有多少个 分析 : 使用线段树成段更新然后再暴力查询总区间的颜色信息即可,这里需要注意的是给区间染色,而不是给点染色,所以 ...

  8. HDU 5861 Road 线段树区间更新单点查询

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5861 Road Time Limit: 12000/6000 MS (Java/Othe ...

  9. ZOJ 1610.Count the Colors-线段树(区间染色、区间更新、单点查询)-有点小坑(染色片段)

    ZOJ Problem Set - 1610 Count the Colors Time Limit: 2 Seconds      Memory Limit: 65536 KB Painting s ...

  10. ZOJ 5638——Prime Query——————【线段树区间更新,区间查询,单点更新】

    Prime Query Time Limit: 1 Second      Memory Limit: 196608 KB You are given a simple task. Given a s ...

随机推荐

  1. 今年把js总结了一下,ppt格式的

    本来想梳理成html,但是时间有限. 希望能够有所帮助. http://pan.baidu.com/s/1ntGAfED http://files.cnblogs.com/danghuijian/js ...

  2. POJ 1006-Biorhythms,中国剩余定理,学信安的路过!

                                                       Biorhythms 我竟然1A了, 终于从一天的浑噩中找回点自信了.人生第一次做中国剩余定理的题 ...

  3. 【POJ1185】炮兵阵地(状压DP)

    题意: 思路:状压DP经典题 可以预处理下每一行内合法的状态,发现很少 所以转移时可以使用状态的编号而不是状态本身 DP时记录前两行状态的编号进行转移和判断 #include<cstdio> ...

  4. Java使用IText(VM模版)导出PDF

    Java使用IText(VM模版)导出PDF: public String createPDF(ProjectManageBase projectManageBase) { Map map = new ...

  5. JFinal Weixin 1.5 发布,微信极速 SDK

    原文:http://www.oschina.net/news/67980/jfinal-weixin-1-5-released JFinal Weixin 1.5 大幅完善了对微信公众平台API的支持 ...

  6. poj——2771 Guardian of Decency

    poj——2771    Guardian of Decency Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5916   ...

  7. Linux 特殊文档说明

    目录 /usr/share/man 目录 /usr/share/doc /etc/passwd 文件 /etc/shadow 文件 /etc/group 文件 /usr/share/man 目录 当我 ...

  8. 转: 使用valgrind检查内存问题

    作者:gfree.wind@gmail.com 博客:blog.focus-linux.net   linuxfocus.blog.chinaunix.net    本文的copyleft归gfree ...

  9. 火狐firefox、谷歌chrome等浏览器扩展、插件介绍

    火狐旧的插件扩展已经不可用,需要更新,这是本人安装的最新的插件 chrome插件 https://www.zhihu.com/question/68338297

  10. O2O助汪峰成功逆袭,汪峰最终上头条了

    8月2日七夕情人节,汪峰<峰暴来临>演唱会在鸟巢10万人体育场唱响,各大报纸.站点娱乐板块并没有等来汪峰向国际章求婚的"头条",只是,与乐视合作现场演出+付费直播的O2 ...