[luogu1558][POJ2777]Count Color(线段树+二进制操作)
来源:互联网 发布:react 源码 component 编辑:程序博客网 时间:2024/06/03 16:28
题目:我是超链接
题解:
首先这题与最传统线段树区别在于:统计区间不同数字个数。不过你可以看到修改的颜色是连续的,且不超过30.这就非常好办了,直接状态压缩要修改的颜色。然后线段树上把左右孩子按位或起来便是。最后区间答案中转成二进制里“1”的个数便是不同数字个数。
代码:
#include <cstdio>#include <iostream>#include <cstring>using namespace std;int sum[400005],delta[400005];void updata(int now){sum[now]=(sum[now<<1]|sum[now<<1|1]);}void build(int now,int l,int r){if (l==r) {sum[now]=1;return;}int mid=(l+r)>>1;if (l<=mid) build(now<<1,l,mid);if (r>mid) build(now<<1|1,mid+1,r);updata(now);}void pushdown(int now){if (delta[now]){delta[now<<1]=delta[now]; delta[now<<1|1]=delta[now];sum[now<<1]=delta[now]; sum[now<<1|1]=delta[now];delta[now]=0;}}void change(int now,int l,int r,int lrange,int rrange,int k){if (lrange<=l && rrange>=r){sum[now]=k; delta[now]=k;return;} int mid=(l+r)>>1;pushdown(now); if (lrange<=mid) change(now<<1,l,mid,lrange,rrange,k); if (rrange>mid) change(now<<1|1,mid+1,r,lrange,rrange,k); updata(now);} int qurry(int now,int l,int r,int lrange,int rrange){if (lrange<=l && rrange>=r) return sum[now];pushdown(now);//这个pushdown如果加在外面就会越界GG int mid=(l+r)>>1,ans=0; if (lrange<=mid) ans|=qurry(now<<1,l,mid,lrange,rrange); if (rrange>mid) ans|=qurry(now<<1|1,mid+1,r,lrange,rrange); updata(now); return ans;} int main(){int l,t,o,i,a,b,c;scanf("%d%d%d",&l,&t,&o);build(1,1,l);for (i=1;i<=o;i++){char s[5];scanf("%s%d%d",s,&a,&b);if (a>b) swap(a,b);if (s[0]=='C'){scanf("%d",&c);change(1,1,l,a,b,1<<c-1);}else{int ans=0;int v=qurry(1,1,l,a,b);while (v){ans+=v&1; v>>=1;}printf("%d\n",ans);}}}
阅读全文
0 0
- [luogu1558][POJ2777]Count Color(线段树+二进制操作)
- poj2777--Count Color(线段树,二进制转化)
- POJ2777 Count Color(线段树)
- POJ2777(线段树)Count Color
- POJ2777 Count Color(线段树+染色)
- poj2777 Count Color(线段树+状压)
- poj2777 Count Color线段树延迟更新,二进制状态记录
- POJ2777 Count Color 线段树
- 【poj2777】【线段树】Count Color
- [poj2777 Count Color]线段树
- 线段树 POJ2777 Count Color
- POJ2777 Count Color【线段树】
- poj2777 Count Color(线段树)
- POJ2777 Count Color 线段树
- poj2777 Count Color 线段树区间更新+位操作
- POJ2777 - Count Color (线段树 区间更新)
- 线段树2 POJ2777 Count Color
- POJ2777——Count Color(线段树)
- 如何进行数据的归一化问题
- bzoj 1689: [Usaco2005 Open] Muddy roads 泥泞的路(模拟)
- web.config中配置数据库连接的两种方式
- An instance of getting the maximum and minimum values in an array
- HDOJ526 LIS水题
- [luogu1558][POJ2777]Count Color(线段树+二进制操作)
- activemq操作示例
- 《linux C语言结构体》笔记
- JavaScript 正则表达式常用的转义符
- NGINX + LUA实现复杂的控制
- Dijkstra算法
- MFC一一拆分窗口类CSplitterWnd
- CentOS 7下使用yum工具安装MySQL 5.7数据库
- getServletContext()方法详解