hdu 5023 && poj 2777(线段染色)2014 ACM/ICPC Asia Regional 广州 Online
来源:互联网 发布:吴敦义 知乎 编辑:程序博客网 时间:2024/06/06 11:37
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5023
http://poj.org/problem?id=2777
题意:给出一个长度为N的线段,分成N段,每一段长度为1,每次操作时,把[L, R]区间染成颜色C,或者输出[L, R]区间里有几种不同的颜色。
分析:因为N比较大,如果模拟操作肯定会超时。这时我们就可以利用线段树的lazy思想来进行求解。
#include<cstdio>#include<cstring>#include<set>#include<algorithm>using namespace std;#define lson l, mid, root<<1#define rson mid+1, r, root<<1|1const int N = 1e6 + 5;set <int> s;set <int> ::iterator it;struct Node { int color; int left; int right; int mid;} a[N<<2];void Push_Down(int root) { if(a[root].color) { a[root<<1].color = a[root].color; a[root<<1|1].color = a[root].color; a[root].color = 0; }}void Build_Tree(int l, int r, int root) { int mid = (l + r) >> 1; a[root].left = l; a[root].right = r; a[root].mid = mid; a[root].color = 2; if(l == r) return; Build_Tree(lson); Build_Tree(rson);}void Update(int l, int r, int c, int root) { if(a[root].left == l && a[root].right == r) { a[root].color = c; return; } if(a[root].color == c) return; Push_Down(root); if(l > a[root].mid) Update(l, r, c, root<<1|1); else if(r <= a[root].mid) Update(l, r, c, root<<1); else { Update(l, a[root].mid, c, root<<1); Update(a[root].mid+1, r, c, root<<1|1); }}void Query(int l, int r, int root) { if(a[root].color) { s.insert(a[root].color); return ; } if(l > a[root].mid) Query(l, r, root<<1|1); else if(r <= a[root].mid) Query(l, r, root<<1); else { Query(l, a[root].mid, root<<1); Query(a[root].mid+1, r, root<<1|1); }}int main() { int n, m; int l, r, c; char op[10]; while(~scanf("%d%d", &n, &m) && (n + m)) { Build_Tree(1, n, 1); for(int i = 0; i < m; i++) { scanf("%s%d%d", op, &l, &r); if(op[0] == 'P') { scanf("%d", &c); Update(l, r, c, 1); } else { s.clear(); Query(l, r, 1); int ss = s.size(); for(it = s.begin(); it != s.end(); it++) { printf("%d", *it); if(ss > 1) printf(" "); ss--; } printf("\n"); } } } return 0;}
0 0
- hdu 5023 && poj 2777(线段染色)2014 ACM/ICPC Asia Regional 广州 Online
- HDU 5475 2015 ACM/ICPC Asia Regional Shanghai Online An easy problem(线段树)
- HDU 5000 Clone / 2014 ACM/ICPC Asia Regional Anshan Online
- HDU 4998 Rotate / 2014 ACM/ICPC Asia Regional Anshan Online
- HDU 5001 Walk / 2014 ACM/ICPC Asia Regional Anshan Online
- hdu 5000 Clone 2014 ACM/ICPC Asia Regional Anshan Online
- hdu 5036 Explosion 2014 ACM/ICPC Asia Regional Beijing Online
- hdu 5033 Building 2014 ACM/ICPC Asia Regional Beijing Online
- HDU Tree LCA 2014 ACM/ICPC Asia Regional Shanghai Online
- 2014 ACM/ICPC Asia Regional Beijing Online HDU 5038
- hdu 5000 Clone 2014 ACM/ICPC Asia Regional Anshan Online
- hdu 5033 Building 2014 ACM/ICPC Asia Regional Beijing Online
- hdu 5045 Contest 2014 ACM/ICPC Asia Regional Shanghai Online
- hdu 5047 Sawtooth 2014 ACM/ICPC Asia Regional Shanghai Online
- hdu 4998 Rotate 2014 ACM/ICPC Asia Regional Anshan Online
- HDU 5040 Instrusive(2014 ACM/ICPC Asia Regional Beijing Online )
- 2014 ACM/ICPC Asia Regional Guangzhou Online
- 2014 ACM/ICPC Asia Regional Guangzhou Online
- php中运用http调用的GET和POST方法
- 网站上传的图片加水印
- 理解iOS 8中的Self Sizing Cells和Dynamic Type
- Android 广播、服务、数据库、通知、包原理
- JS面向对象编程之对象
- hdu 5023 && poj 2777(线段染色)2014 ACM/ICPC Asia Regional 广州 Online
- jQuery的选择器性能
- sprintf函数在字符串处理的妙用
- 进程与线程
- java +jsp实现的点击加载更多,实现数据的异步加载
- Android js交互错误:Uncaught TypeError: Object [object Object] has no method 'xxx'
- this kernel requires an x86-64 CPU, but only detected an i686 CPU. unable to boot - please ues a ker
- ArcGIS系统要求知多少
- 1006. Sign In and Sign Out (25)——PAT (Advanced Level) Practise