Count Color poj2777 线段树

题意

有一个长木板,现在往上面在一定区间内刷颜色,后来刷的颜色会掩盖掉前面刷的颜色,问每次一定区间内可以看到多少种颜色。

解题思路

这里使用线段树,因为刷颜色可以看作是区间修改,使用lazy标记区间的颜色种类,下传标记后,当前节点的lazy标记就标记为0,然后使用vis数组来标记颜色(颜色种类很少)。剩下的基本就是线段树的模板了。

代码实现

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+17;
struct node{
int l, r, lazy;
}a[maxn<<2];
int vis[35];//颜色种类
int L, T, O, ans;
void build(int rt, int l, int r)
{
a[rt].l=l;
a[rt].r=r;
a[rt].lazy=1;//默认为第一种颜色
if(l==r){
return ;
}
int mid=(l+r)>>1;
build(rt<<1, l, mid);
build(rt<<1|1, mid+1, r);
}
void down(int k)
{
a[k<<1].lazy=a[k].lazy;
a[k<<1|1].lazy=a[k].lazy;
a[k].lazy=0;//表示他的节点下面可能是两种不同的颜色
}
void update(int rt, int L, int R, int x)
{
if(L<=a[rt].l && a[rt].r<=R)
{
a[rt].lazy=x;
return ;
}
int mid=(a[rt].l+a[rt].r)>>1;
if(a[rt].lazy !=0 ) //记得一定要下传标记
down(rt);
if(L<=mid) update(rt<<1, L, R, x);
if(R>mid) update(rt<<1|1, L, R, x);
}
void query(int rt, int L, int R)
{
if(a[rt].lazy!=0) //如果不为零就可以进行判断,因为下面的也是这种颜色
{
if(!vis[a[rt].lazy])// 看是否之前标记过
{
ans++; //没有标记就加一
vis[a[rt].lazy]=1; //标记
}
return ;
}
int mid=(a[rt].l+a[rt].r)>>1;
if(a[rt].lazy!=0)
down(rt);
if(L<=mid) query(rt<<1, L, R);
if(R>mid) query(rt<<1|1, L, R);
}
int main()
{
int l, r, c;
char s[4];
while(scanf("%d%d%d", &L, &T, &O)!=EOF)
{
build(1, 1, L);
for(int i=1; i<=O; i++)
{
scanf("%s", s);
if(s[0]=='C')
{
scanf("%d%d%d", &l, &r, &c);
if(l > r){
swap(l, r);
}
update(1, l, r, c);
}
else {
scanf("%d%d", &l, &r);
if(l > r) {
swap(l, r);
}
memset(vis, 0, sizeof(vis));
ans=0;
query(1, l, r);
printf("%d\n", ans);
}
}
}
return 0;
}

最新文章

  1. 看看C# 6.0中那些语法糖都干了些什么(上篇)
  2. 如何解决mathpage.dll或MathType.dll文件找不到问题
  3. Django提交POST表单“CSRF verification failed. Request aborted”问题的解决
  4. BitTorrent Sync - 神奇的文件同步软件,无需服务器让多台电脑互相同步!
  5. Android mvp模式、mvvm模式
  6. [转]C# 应用程序安装部署步骤,安装前操作,先退出程序后卸载。
  7. 添加常驻Notification
  8. eclipse下使用tomcat启动maven项目
  9. 利用checkinstall制作deb或rpm工具包
  10. UVa 10305 Ordering Tasks (例题 6-15)
  11. 把excel数据导入mysql中
  12. database.properties数据源
  13. nginx静态服务器配置
  14. MYSQL—— 完整性约束条件中primary key、auto_increment使用总结!
  15. luogu 3166 组合与gcd(数三角形)结论
  16. Perl处理数据(二):tr和y///
  17. 3、jeecg 笔记之 模糊查询
  18. Linux 搭建Hadoop集群 成功
  19. poj 1256 按一定顺序输出全排列(next_permutation)
  20. 自定义Exception异常

热门文章

  1. CSS3边框 阴影 box-shadow
  2. 点击链接跳转到QQ的情况; qq交谈
  3. 对postcss-plugin-px2rem的研究
  4. CSS3实现三角形和对话框
  5. docker安装禅道
  6. OpenCV Mat&amp;Operations
  7. Swift equality
  8. va_list原理及用法
  9. es之java各种查询操作
  10. [CSP-S模拟测试]:超级树(DP)