HDU3397区间合并 延迟标记
来源:互联网 发布:淘宝813 编辑:程序博客网 时间:2024/06/07 22:36
代码太长了,改了好久还是WA,样例过了。。。改的太难受了,不改了,先存起来等心情好再重写一遍吧
下面是错误代码
#include<iostream>#include<algorithm>using namespace std;#define mid ((l+r)/2)#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define lowbit(i) (i&-i)#define max(a,b) (a>b?a:b)#define min(a,b) (a<b?a:b)#define mem(arr,a) memset(arr,a,sizeof(arr))#define L (rt<<1)#define R (rt<<1|1)#define INF 0f3f3f3f3f#define N 100000+5#define INF 0x3f3f3f3f#define LL long long int#define sd1(a) scanf("%d",&a)#define sd2(a,b) scanf("%d%d",&a,&b)#define sd3(a,b,c) scanf("%d%d%d",&a,&b,&c)#define pd1(a) printf("%d",a)#define pd2(a,b) printf("%d%d",a,b)/******************/struct node{ int l, r, m; int lmin, rmax; int ll, rr, mm; int num;};node s[N << 2];int lazy[N << 2];void pushup(int rt, int m){ s[rt].m = 0; s[rt].mm = 0; s[rt].l = s[L].l; s[rt].r = s[R].r; s[rt].rmax = s[R].rmax; s[rt].lmin = s[L].lmin; s[rt].num = s[L].num + s[R].num; s[rt].ll = s[L].ll; s[rt].rr = s[R].rr; if (s[rt].l == (m - (m >> 1))) s[rt].l += s[R].l; if (s[rt].r == (m >> 1)) s[rt].r += s[L].r; if (s[rt].ll == (m - (m >> 1))) s[rt].ll += s[R].ll; if (s[rt].rr == (m >> 1)) s[rt].rr += s[L].rr; if (s[L].rmax&&s[R].lmin) s[rt].m = s[L].r + s[R].l; if (!s[L].rmax&&!s[R].lmin) s[rt].mm = s[L].rr + s[R].ll; s[rt].m = max(s[rt].m, max(s[rt].l, s[rt].r)); s[rt].mm = max(s[rt].mm, max(s[rt].ll, s[rt].rr));}void pushdown(int rt, int op, int m){ if (lazy[rt] != -1) { lazy[L] = lazy[R] = lazy[rt]; if (lazy[rt] >= 0 && lazy[rt] <= 1){ s[L].l = s[L].r = s[L].m = s[L].num = lazy[L] * (m - (m >> 1)); s[L].lmin = s[L].rmax = lazy[L]; s[L].ll = s[L].rr = s[L].mm = (lazy[L] + 1) % 2; s[R].l = s[R].r = s[R].m = s[R].num = lazy[R] * (m >> 1); s[R].lmin = s[R].rmax = lazy[R]; s[R].ll = s[R].rr = s[R].mm = (lazy[R] + 1) % 2; } else if (lazy[rt] == 2){ s[L].lmin = (s[L].lmin + 1) % 2; s[L].rmax = (s[L].rmax + 1) % 2; s[L].num = (m-(m>>1)) - s[L].num; swap(s[L].l, s[L].ll); swap(s[L].r, s[L].rr); swap(s[L].m, s[L].mm); s[R].num = (m >> 1) - s[R].num; s[R].lmin = (s[R].lmin + 1) % 2; s[R].rmax = (s[R].rmax + 1) % 2; swap(s[R].l, s[R].ll); swap(s[R].r, s[R].rr); swap(s[R].m, s[R].mm); } lazy[rt] = -1; }}void build(int l, int r, int rt){ lazy[rt] = -1; if (l == r){ sd1(s[rt].num); s[rt].l = s[rt].r = s[rt].m = s[rt].lmin = s[rt].rmax = s[rt].num; s[rt].ll = s[rt].rr = s[rt].mm = (s[rt].num + 1) % 2; return; } build(lson); build(rson); pushup(rt, r - l + 1);}void update(int a, int b, int op, int l, int r, int rt){ if (a <= l&&r <= b){ lazy[rt] = op; if (op <= 1){ s[rt].l = s[rt].r = s[rt].m = s[rt].num = op*(r - l + 1); s[rt].lmin = s[rt].rmax = op; s[rt].ll = s[rt].rr = s[rt].mm = (op + 1) % 2 * (r - l + 1); } else{ s[rt].lmin = (s[rt].lmin + 1) % 2; s[rt].rmax = (s[rt].rmax + 1) % 2; s[rt].num = r - l + 1 - s[rt].num; swap(s[rt].l, s[rt].ll); swap(s[rt].r, s[rt].rr); swap(s[rt].m, s[rt].mm); } return; } pushdown(rt, op, r - l + 1); if (a <= mid)update(a, b, op, lson); if (b>mid)update(a, b, op, rson); pushup(rt, r - l + 1);}int query(int a, int b, int op, int l, int r, int rt){ if (op == 3){ if (a <= l&&r <= b)return s[rt].num; pushdown(rt, op, r - l + 1); int res = 0; if (a <= mid)res += query(a, b, op, lson); if (mid<b)res += query(a, b, op, rson); return res; } else if (op == 4){ if (a <= l&&r <= b)return s[rt].m; pushdown(rt, op, r - l + 1); int res = 0; if (b <= mid)return query(a, b, op, lson); else if (a>mid)return query(a, b, op, rson); else{ int v = 0; int v1 = query(a, b, op, lson); int v2 = query(a, b, op, rson); if (s[L].rmax&&s[R].lmin){ v = min(s[L].r, mid - max(a, l) + 1) + min(s[R].l, min(b, r) - mid); } return max(v, max(v1, v2)); } }}int main(){ int t, n, m; cin >> t; while (t--){ cin >> n >> m; build(1, n, 1); while (m--){ int op, a, b; cin >> op >> a >> b; if (op >= 0 && op <= 2){ update(a + 1, b + 1, op, 1, n, 1); } else { cout << query(a + 1, b + 1, op, 1, n, 1) << endl; } } }}
0 0
- HDU3397区间合并 延迟标记
- HDU3397 线段树 区间合并 双标记
- hdu3911(线段树,区间合并,延迟标记)
- hdu3397 Sequence operation 线段树区间合并
- HDU3397:Sequence operation(线段树区间合并)
- hdu3397(线段树区间合并)
- [线段树]poj3667 Hotel(区间合并、更新、延迟/懒惰标记
- POJ 3667 Hotel(线段树+区间合并+延迟标记)
- hdu3397 Sequence operation--区间操作 & 双标记(待解决)
- HDU3397 Sequence operation(线段树的区间合并)
- hdoj 3397 Sequence operation 【线段树区间覆盖 + 异或 + 合并】【维护延迟标记的顺序】
- HDU3397 Sequence operation 区间修改,区间异或,区间合并,线段树经典题
- 线段树区间更新延迟标记
- 线段树 (区间修改 区间查询 延迟标记)
- hdu 1698 (延迟标记+区间修改+区间求和)
- 线段树区间维护hdu3397
- POJ 3667 线段树 + 延迟标记 + 区间处理
- 线段树区间更新模板(lazy延迟标记)(1698)
- n皇后,2n皇后
- 有关Unable to start activity ComponentInfo的一点BUG
- Java核心技术 卷一 笔记十 参数传递设计的调用
- 使用虚拟沙箱安装Tensorflow
- [bzoj3743][Coci2015]Kamp
- HDU3397区间合并 延迟标记
- 栈的基本操作
- 关于IP遇到的坑
- ML2 配置 OVS VxLAN
- python学习语法
- STM32 —— 多路ADC采集
- Mysql 创建定时任务
- 写操作系统只能用C语言和汇编语言吗
- Linux 下编译运行C程序