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;
}

转载于:https://www.cnblogs.com/alking1001/p/11316507.html

Count Color poj2777 线段树相关推荐

  1. POJ 2777 Count Color (线段树区间修改 + 状态压缩)

    题目链接:POJ 2777 Count Color [题目大意] 给你 n 块板子, 编号1--n , 板子的颜色最多30种, 初始时  板子的颜色都是 1: 有两种操作 1 .把给定区间的板子染成一 ...

  2. POJ 2777 - Count Color(线段树区间更新+状态压缩)

    题目链接 https://cn.vjudge.net/problem/POJ-2777 [题意] 有一个长度为 LLL 的区间 [1,L][1,L][1,L] ,有 TTT 种颜色可以涂,有 QQQ ...

  3. poj2777线段树

    题目大意:有一长为L的木板,将其分为等长的L段,从左到右编号为1~L.现将L段木板着色 1. 输入"C A B C" 是将A到B这一段着成C这种颜色. 2. 输入"P A ...

  4. 数据结构二之线段树Ⅰ——Count Color,Hotel,Transformation,Tree Generator™

    普通的下标线段树 Count Color Hotel Transformation Tree Generator™ Count Color POJ2777 查询区间内颜色种类数,观察到颜色种类数只有3 ...

  5. 线段树入门 (zz)

    从简单说起,线段树其实可以理解成一种特殊的二叉树.但是这种二叉树较为平衡,和静态二叉树一样,都是提前已经建立好的树形结构.针对性强,所以效率要高.这里又想到了一句题外话:动态和静态的差别.动态结构较为 ...

  6. poj 2777 Count Color(线段树区区+染色问题)

    题目链接:  poj 2777 Count Color 题目大意:  给出一块长度为n的板,区间范围[1,n],和m种染料 k次操作,C  a  b  c 把区间[a,b]涂为c色,P  a  b 查 ...

  7. 【HDU - 6183】Color it(CDQ分治 或 动态开点线段树)

    题干: Do you like painting? Little D doesn't like painting, especially messy color paintings. Now Litt ...

  8. 线段树-Count on a Treap-神题

    Count on a Treap 题目来源 Codechef Feb 2014 COT5 https://www.codechef.com/problems/COT5 问题提出 什么是Treap 是一 ...

  9. HDU1556 Color the ball【差分数组+线段树】

    Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...

最新文章

  1. 如何优化cocos2d程序的内存使用和程序大小:第一部分
  2. linux根据pid查看进程,linux根据pid获取进程名和获取进程pid(c语言获取pid)
  3. arp_annouce=2详解
  4. java设计模式之设计原则⑥里氏代换原则
  5. Division CodeForces - 1445C(数论因子相关)
  6. Wooden Sticks POJ - 1065(最大上升子序列+动态规划状态转移思维)
  7. CREO - 基础2 - 如何让装配好的零件重新装配
  8. 解决自定义actionbar 两边空隙
  9. 在此iphone上尚未受信任_来自苹果这样的电话千万别接,不然 iPhone 没了...
  10. 权限角色管理学习(二)
  11. SpringCloud学习笔记023---SpringBoot集成Dubbo_依赖zookeeper实现分布式应用一致性以及远程服务调用
  12. linux查看某个时间段的日志
  13. 【React-2】组件开发初步探索
  14. HUSTOJ(2019)在线判题系统的从零开始搭建过程
  15. Git和码云项目平台使用文档
  16. 在Ubuntu系统中安装字体(以安装华文行楷和方正舒体为例)
  17. mysql建表语句转换成oracle,如何手动将ORACLE的sql建表语句转换为MYSQL的建表语句...
  18. printf()输出格式大全(附 - 示例代码)
  19. Unity Rect.OverLaps(Rect other) 改进
  20. 【apache lang3】import org.apache.commons.lang3.StringUtils error----Cannot resolve symbol ‘lang3‘

热门文章

  1. Node.js 切近实战(十一) 之实时通讯
  2. 在android studio中创建Hello-JNI工程
  3. win2008 server_R2 自动关机 解决
  4. 使用Grunt构建任务管理脚本(转)
  5. (\w+)\s*, \s*(\w+)
  6. linux下载b站的视频+ffmpeg抽取出mp3
  7. Cython屏蔽GIL锁实践
  8. pyspark连接mysql
  9. 解决spark-shell输出日志信息过多
  10. 深圳乐易网络有限公司机试题String to Integer (atoi)