poj 2777 Count Color【线段树段更新】
来源:互联网 发布:知乎深圳希尔顿自助餐 编辑:程序博客网 时间:2024/05/17 06:00
题目:poj 2777 Count Color
题意:给出一段1 * n 的栅栏,有两种操作,第一种:把 l -- r 全部染成同一颜色t,第二种,查询 l---r 一共有多少种颜色。
分类:线段树
分析:我们可以给每个节点加一个标记,标记当前节点是否只有一种颜色,然后对只有一种颜色的节点如果要染色的话,那么他会变成几种颜色的,这时候记得向下更新一次就好,统计的时候统计节点有单个颜色的颜色就好。
代码:
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>using namespace std;const int N = 110000;struct Node{ int l,r; long long num;};Node tree[4*N];int vis[35];void build(int l,int r,int o){ tree[o].l=l; tree[o].r=r; tree[o].num=1; if(l==r) return ; int mid=(l+r)/2; build(l,mid,o*2); build(mid+1,r,o*2+1);}void update(int l,int r,int t,int o){ if(tree[o].l==l && tree[o].r==r) { tree[o].num=t; return; } if(tree[o].num==t) return; if(tree[o].num!=-1) { tree[2*o].num=tree[o].num; tree[2*o+1].num=tree[o].num; tree[o].num=-1; } int mid=(tree[o].l+tree[o].r)>>1; if(r<=mid) update(l,r,t,o+o); else if(l>mid) update(l,r,t,o+o+1); else { update(l,mid,t,o*2); update(mid+1,r,t,o*2+1); }}void query(int l,int r,int o){ if(tree[o].num!=-1) { vis[tree[o].num]=1; return ; } int mid=(tree[o].l+tree[o].r)>>1; if(r<=mid) query(l,r,o+o); else if(l>mid) query(l,r,o+o+1); else { query(l,mid,o*2); query(mid+1,r,o*2+1); }}int main(){ int n,c,m; while(~scanf("%d%d%d",&n,&c,&m)) { build(1,n,1); while(m--) { getchar(); char ok; int x,y,z; scanf("%c",&ok); if(ok=='C') { scanf("%d%d%d",&x,&y,&z); update(x,y,z,1); } else { int ans=0; memset(vis,0,sizeof(vis)); scanf("%d%d",&x,&y); query(x,y,1); for(int i=1;i<=30;i++) if(vis[i]) ans++; printf("%d\n",ans); } } } return 0;}
0 0
- POJ 2777 Count Color 线段树 成段更新
- poj 2777 Count Color【线段树段更新】
- poj 2777 Count Color(线段树 Lazy-Tag思想 成段更新+区间统计)
- POJ 2777 Count Color (线段树区间更新)
- POJ 2777 Count Color 线段树区间更新位运算
- poj 2777 Count Color (线段树区间更新)
- 线段树区间更新,区间统计 poj 2777 Count Color
- [POJ 2777]Count Color[线段树区间更新查询]
- poj 2777 Count Color(线段树 区间更新)
- poj 2777 Count Color (线段树 区间更新 染色)
- POJ 2777 Count Color 线段树 区间更新
- poj 2777 Count Color 线段树区间更新
- POJ 2777 Count Color (线段树区间更新)
- POJ 2777 Count Color(线段树区间更新+状压)
- POJ 2777 Count Color(线段树区间更新)
- poj 2777 Count Color(线段树区间更新+技巧)
- POJ 2777 Count Color(线段树,区间更新,查询)
- poj 2777 Count Color (成段更新+区间求和)
- label 模糊看不清除,问题
- 加入这个CSDN的宣言
- mysql 取blob前4个字节 转成unsigned int
- 关于db2的一点记录
- 【转自】链接中 href='#' 和 href='###' 的区别
- poj 2777 Count Color【线段树段更新】
- Xwindows开发学习
- 寻找丑数
- Java判断字符是否是汉字,界限【 19968--171941 】
- poj3370,抽屉原理
- 【初识Oracle】④数据库对表格数据进行操作(含三张练习用表)
- session.createQuery()与createSQLQuery()区别
- 范德萨发的
- /usr/bin/Xvnc: symbol lookup error: /usr/bin/Xvnc: undefined symbol: pixman_composite_trapezoids