hdu 3911 线段树的区间合并
2017-07-01 15:30
716 查看
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #define N 500010 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; int s1 ,s2 ,l1 ,r1 ,l2 ,r2 ,d ; inline int MAX(int a,int b) { return a>b?a:b; } inline int MIN(int a,int b) { return a<b?a:b; } void diverse(int rt) { swap(l1[rt],l2[rt]); swap(r1[rt],r2[rt]); swap(s1[rt],s2[rt]); } void pushup(int l,int r,int rt) {int m=(l+r)>>1; l1[rt]=l1[rt<<1]; l2[rt]=l2[rt<<1]; if(l1[rt<<1]==(m-l+1)) l1[rt]+=l1[rt<<1|1]; if(l2[rt<<1]==(m-l+1)) l2[rt]+=l2[rt<<1|1]; r1[rt]=r1[rt<<1|1]; r2[rt]=r2[rt<<1|1]; if(r1[rt<<1|1]==(r-m)) r1[rt]+=r1[rt<<1]; if(r2[rt<<1|1]==(r-m)) r2[rt]+=r2[rt<<1]; s1[rt]=MAX(r1[rt<<1]+l1[rt<<1|1],MAX(s1[rt<<1],s1[rt<<1|1])); s2[rt]=MAX(r2[rt<<1]+l2[rt<<1|1],MAX(s2[rt<<1],s2[rt<<1|1])); } void pushdown(int rt) { if(d[rt]) { d[rt<<1]^=1; d[rt<<1|1]^=1; d[rt]=0; diverse(rt<<1); diverse(rt<<1|1); } } void build(int l,int r,int rt) { d[rt]=0; if(l==r) { int t; scanf("%d",&t); l1[rt]=r1[rt]=s1[rt]=t; l2[rt]=r2[rt]=s2[rt]=!t; return ; } int m=(l+r)>>1; build(lson); build(rson); pushup(l,r,rt); } void update(int a,int b,int l,int r,int rt) { if(b<l||a>r) return ; if(a<=l&&r<=b) { d[rt]^=1; diverse(rt); return ; } pushdown(rt); int m=(l+r)>>1; update(a,b,lson); update(a,b,rson); pushup(l,r,rt); } int query(int a,int b,int l,int r,int rt) { if(b<l||a>r) return 0; if(a<=l&&r<=b) return s1[rt]; pushdown(rt); int m=(l+r)>>1; int res1=query(a,b,lson); int res2=query(a,b,rson); return MAX(MIN(m-a+1,r1[rt<<1])+MIN(b-m,l1[rt<<1|1]),MAX(res1,res2)); } int main() { int n; while(~scanf("%d",&n)) { build(1,n,1); int q; scanf("%d",&q); while(q--) { int t,a,b; scanf("%d%d%d",&t,&a,&b); if(t)update(a,b,1,n,1); else printf("%d\n",query(a,b,1,n,1)); } } }
相关文章推荐
- HDU 3911 Black And White(线段树区间合并)
- hdu 3911 Black And White 线段树区间合并
- hdu 3911 线段树+区间合并
- HDU 3911 Black And White(线段树区间合并+lazy操作)
- 【HDU - 3911】Black And White 【线段树+区间操作+区间合并】
- HDU 3911 Black And White(线段树区间合并+lazy操作)
- hdu 3911 black and white 线段树区间合并
- HDU 3911 线段树区间合并+异或操作
- HDU 3911 线段树区间合并
- hdu 3911 线段树基本功 区间合并
- HDU 3911 线段树区间合并、异或取反操作
- HDU 3911 Black And White (线段树区间合并 + lazy标记)
- hdu 3911 Black And White 区间合并 线段树
- HDU 3308 线段树 区间合并模板题
- HDU 3308 LCIS 线段树 区间合并 入门题
- [HDU 3308]LCIS[线段树][区间合并]
- HDU 3911 线段树区间染色 区间查询
- HDU 3308【线段树-query:区间最长单调上升序列,update:结点更新,区间合并】
- HDU 3308【线段树--c++版区间合并,dp】
- hdu 3308 LCIS(线段树区间合并)