poj 2777 Count Color
来源:互联网 发布:旧版手机淘宝2014安卓 编辑:程序博客网 时间:2024/06/06 09:33
题目链接:http://poj.org/problem?id=2777
题意:有一根长为L的木板,有两种对木板的操作,一种是把一段木板[a, b]涂成一种颜色,另一种操作是求木板段[a, b]中共有多少种颜色。其中颜色有T种, 木板默认的颜色是颜色1.
方法:线段树,这个道题的技巧是要用到位操作,因为颜色最多有30种。其中要用到Lazy-Tag的思想。
代码如下:
#include <iostream>#include <cstdio>#define MAX 100001using namespace std;struct node{ int l, r, color; bool flag;}v[5*MAX];void pushup(int n){ v[n].color = v[2*n].color | v[2*n+1].color;}void pushdown(int n){ if (v[n].flag) { v[2*n].flag = true; v[2*n+1].flag = true; v[2*n].color = v[n].color; v[2*n+1].color = v[n].color; v[n].flag = false; }}void build(int l, int r, int n){ v[n].l = l; v[n].r = r; v[n].flag = false; if (l == r) { v[n].color = 1; return ; } int mid = (l+r)/2; build(l, mid, 2*n); build(mid+1, r, 2*n+1); pushup(n);}void update(int l, int r, int d, int n){ if (l<=v[n].l && v[n].r<=r) { v[n].flag = true; v[n].color = 1<<(d-1); return ; } pushdown(n); int mid = ( v[n].l + v[n].r )/2; if (r<=mid) update(l, r, d, 2*n); else if (l > mid) update(l, r, d, 2*n+1); else { update(l, mid, d, 2*n); update(mid+1, r, d, 2*n+1); } pushup(n);}int query(int l, int r, int n){ if (l<=v[n].l && v[n].r<=r) return v[n].color; pushdown(n); int mid = (v[n].l + v[n].r)/2; if (r <= mid) return query(l, r, 2*n); else if (l > mid) return query(l, r, 2*n+1); else return query(l, mid, 2*n) | query(mid+1, r, 2*n+1);}int main(){ int L, T, O, a, b, c; char ch; while (~scanf("%d%d%d", &L, &T, &O)) { build(1, L, 1); while (O--) { getchar(); scanf("%c", &ch); if (ch == 'C') { scanf("%d %d %d", &a, &b, &c); if (a<b) update(a, b, c, 1); else update(b, a, c, 1); } else { scanf("%d %d", &a, &b); int t; if (a < b) t = query(a, b, 1); else t = query(b, a, 1); int len = 0; for(int i=0; i<T; i++) if(t & (1<<i)) len++; printf("%d\n", len); } } } return 0;}
- 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
- poj 2777 Count Color
- POJ--2777--Count Color
- Count Color poj 2777
- HNCU1741:算法3-2:行编辑程序
- Android设置标题栏图标
- MHP 对象轮播HTML应用解析与实现
- RTSP调试代码
- oracle case when的使用方法
- poj 2777 Count Color
- What is the purpose of @SmallTest, @MediumTest, and @LargeTest annotations in Android?
- Java2-J2EE的13种技术
- VS环境下使用makefile文件编译
- 函数形参中的const引用
- IOS学习笔记(6)label textField textview
- OpenSSL常用函数--证书操作
- HNCU1742:算法3-3:迷宫
- Android 仿大众点评团购购买条浮动效果