HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)
2014-09-23 09:35
681 查看
http://acm.hdu.edu.cn/showproblem.php?pid=5023
题意:p a b c 就是将a-b区间更新为c.
q a b 就是查询a-b区间的值
输出所有的值(不重复),并且升序输出。
题解:
用线段树的区间更新做。在查询的时候,用一个数组去记录该区间出现的值,最后把该数组排序去重后,就是结果
题意:p a b c 就是将a-b区间更新为c.
q a b 就是查询a-b区间的值
输出所有的值(不重复),并且升序输出。
题解:
用线段树的区间更新做。在查询的时候,用一个数组去记录该区间出现的值,最后把该数组排序去重后,就是结果
#include <cstdio> #include<string.h> #include<algorithm> using namespace std; #define LL __int64 const int N = 1000000+10; LL t,cnt,ans ; struct node{ int left, right; LL add; }arr[N*3]; void pushDown(int idx){ LL tmp = arr[idx].add; int l = idx << 1, r = (idx << 1) ^ 1; arr[l].add = tmp; arr[r].add = tmp; arr[idx].add = 0; } void build(int idx, int l, int r){ arr[idx].left = l, arr[idx].right = r; arr[idx].add = 0; if(l == r){ arr[idx].add = 2; return ; } int mid = (l + r) >> 1; build(idx * 2, l, mid); build(idx * 2 + 1, mid + 1, r); } void update(int idx, int l, int r, int val){ if(arr[idx].right < l||arr[idx].left > r) return ; if(arr[idx].left >= l&&arr[idx].right <= r){ arr[idx].add = val; return ; } if(arr[idx].add != 0) pushDown(idx); update(idx * 2, l, r, val); update(idx * 2 + 1, l, r, val); return ; } void query(int idx, int l, int r){ if(arr[idx].right < l||arr[idx].left > r) return; if(arr[idx].left >= l&&arr[idx].right <= r&&arr[idx].add!=0){//注意这个地方的arr[idx].add不为零,才是扩展到了查询的区间想要的值 ans[cnt++]=arr[idx].add; return ; } if(arr[idx].add != 0) pushDown(idx); query(idx * 2, l, r); query(idx * 2 + 1, l, r); return; } int main(){ int n, i, q, l, r; char ord[10]; while(~scanf("%d %d", &n, &q),n){ build(1, 1, n); while(q--){ memset(ord,0,sizeof(ord)); scanf("%s", ord); if(ord[0] == 'Q'){ cnt=0; scanf("%d %d", &l, &r); query(1,l,r); sort(ans,ans+cnt); int lastans=unique(ans,ans+cnt)-ans; for(i=0;i<lastans;i++){ if(i!=0) printf(" "); printf("%lld",ans[i]); } puts(""); } else { scanf("%d %d %lld", &l, &r, &t); update(1, l, r, t); } } } return 0; }
相关文章推荐
- HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)
- hdu 5023 A Corrupt Mayor's Performance Art(线段树区间更新)
- hdu 5023 A Corrupt Mayor's Performance Art (线段树+区间更新+状压)
- hdu 5023 A Corrupt Mayor's Performance Art 广州网络赛 线段树的区间覆盖+种类查询
- HDU 5023 A Corrupt Mayor's Performance Art 线段树 区间染色
- hdu-5023 A Corrupt Mayor's Performance Art (线段树区间修改)
- hdu 5023 A Corrupt Mayor's Performance Art(线段树区间合并)
- HDU - 5023 A Corrupt Mayor's Performance Art(区间修改)
- HDU 5023 A Corrupt Mayor's Performance Art (线段树区间更新,入门详解)
- HDU 5023 A Corrupt Mayor's Performance Art (线段树)
- A Corrupt Mayor's Performance Art+线段树区间更新查询
- HDU 5023 A Corrupt Mayor's Performance Art (线段树)
- HDU 5023 - A Corrupt Mayor's Performance Art(线段树区间更新+状态压缩)
- hdu 5023 A Corrupt Mayor's Performance Art(线段树+位运算)
- 【HDU】5023 A Corrupt Mayor's Performance Art 线段树
- HDU 5023 A Corrupt Mayor's Performance Art(线段树+优美的位运算)
- HDU - 5023 A Corrupt Mayor's Performance Art(线段树区间覆盖,位运算)
- HDU_5023 A Corrupt Mayor's Performance Art
- HDU-A Corrupt Mayor's Performance Art【线段树+位运算】
- HDU 5023 A Corrupt Mayor's Performance Art