hdu 3911 线段树的区间合并

来源:互联网 发布:淘宝个人好评率怎么看 编辑:程序博客网 时间:2024/06/05 05:31
#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|1using namespace std;int s1[N],s2[N],l1[N],r1[N],l2[N],r2[N],d[N];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));}}}

原创粉丝点击