poj 2777 count color
2016-05-13 17:39
423 查看
中文翻译:
题目描述
罗老师有n个点需要染色,一开始这些点染的颜色都是1, 接下来有两种操作:C a b c: 表示将[a, b]区间的点染成c颜色
P a b: 表示询问[a, b]区间现在有多少种颜色
对于每个询问操作,你需要输出相应的答案。
输入
输入n, C, m,分别表示有n个点,颜色种类最多C种, m个操作接下来m行,每行输入一种操作
输出
对于每个询问输出相应答案
样例输入
2 2 4 C 1 1 2 P 1 2 C 2 2 2 P 1 2
样例输出
2 1
提示
【数据规模和约定】1<=n, m<=100000
1<= C <=30
1<= a, b <=n
1<= c <= C
考虑到C很小,所以可以用状压的思想,直接用一个数来表示有哪些颜色,每次用or运算。
#include<cstdio> #include<iostream> #define p1 id<<1 #define p2 id<<1^1 using namespace std; char s[5]; int n,m,C,x,y,z; int tree[450000],add[450000]; int a[150000]; void build(int id,int l,int r) { tree[id]=add[id]=1; if(l==r) return; int mid=(l+r)>>1; build(p1,l,mid); build(p2,mid+1,r); } void update(int id,int l,int r,int x,int y,int z) { if(x<=l&&r<=y) { tree[id]=(1<<(z-1)); add[id]=1; return; } if(add[id]==1) //add[id]=1,表示该区间内颜色统一,=0则有多种颜色 { tree[p1]=tree[id]; tree[p2]=tree[id]; add[p1]=1; add[p2]=1; add[id]=0; } int mid=(l+r)>>1; if(y<=mid) update(p1,l,mid,x,y,z); else if(x>mid) update(p2,mid+1,r,x,y,z); else { update(p1,l,mid,x,mid,z); update(p2,mid+1,r,mid+1,y,z); } tree[id]=tree[p1]|tree[p2]; } int query(int id,int l,int r,int x,int y) { if(x<=l&&r<=y) return tree[id]; if(add[id]==1) { tree[p1]=tree[id]; tree[p2]=tree[id]; add[p1]=1; add[p2]=1; add[id]=0; } int mid=(l+r)>>1; int res; if(y<=mid) res=query(p1,l,mid,x,y); else if(x>mid) res=query(p2,mid+1,r,x,y); else res=query(p1,l,mid,x,mid)|query(p2,mid+1,r,mid+1,y); tree[id]=tree[p1]|tree[p2]; return res; } int main() { cin>>n>>C>>m; build(1,1,n); for(int i=1;i<=m;i++) { scanf("%s",s+1); if(s[1]=='C') { scanf("%d%d%d",&x,&y,&z); if(x>y) swap(x,y); update(1,1,n,x,y,z); } else { scanf("%d%d",&x,&y); if(x>y) swap(x,y); int state=query(1,1,n,x,y); int ans=0; while(state!=0) { if(state%2==1) ans++; state=state>>1; } printf("%d\n",ans); } } return 0; }
相关文章推荐
- 使用WireShark抓包分析Android网络请求时间(二)
- 【B/S】jQuery简介及语法
- mysql链表查询
- HDU_3182_Hamburger Magi_状态压缩dp
- 并查集
- 知道这20个正则表达式 能让你少写1,000行代码
- keyCode对照表
- APP开机自启动
- AD域账户自动登陆(仅限IE浏览器)Java简单实现
- 【REACT NATIVE 系列教程之三】函数绑定与FLEXBOX是用好REACT的基础
- jq的slideToggle()在ie8里遇到bug:下盒子的margin—top失效,margin-top塌陷解决方法
- 常浏览的博客和网站
- java中文乱码解决之道(八)—–解决URL中文乱码问题
- 如何调用Android隐藏API
- 算法15 之二叉树排序
- 算法14 之归并排序
- CentOS7 PostgreSQL 主从配置( 三)
- 整理:Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- docker学习-简单安装及使用
- Invalid Regular Expression Options