hdu 3911
来源:互联网 发布:linux tail 最后一页 编辑:程序博客网 时间:2024/03/29 19:21
题目
一直在用3397的现有代码去掉功能来代入这道题
但是莫名的TLE了。
于是按照网上大部分的方法,多维护了黑色的左,中,右最长连续
由于PushDown的时候忘记了把延迟标记传递下去,又贡献了几次WA
最后在输入加速和inline的帮助下,成功600ms AC
代码如下:
// 593ms#include<iostream>#include<cstdio>using namespace std;#define maxn 100010#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1struct Tree{ int l,r; int lazy; int lsum,msum,rsum;//white int lnum,mnum,rnum;//black}tree[maxn<<2];int num[maxn];inline void PushUp(int rt){ tree[rt].lsum=tree[rt<<1].lsum; tree[rt].rsum=tree[rt<<1|1].rsum; if(tree[rt].lsum==(tree[rt<<1].r-tree[rt<<1].l+1)) tree[rt].lsum+=tree[rt<<1|1].lsum; if(tree[rt].rsum==(tree[rt<<1|1].r-tree[rt<<1|1].l+1)) tree[rt].rsum+=tree[rt<<1].rsum; tree[rt].msum=max(tree[rt<<1].rsum+tree[rt<<1|1].lsum,max(tree[rt<<1].msum,tree[rt<<1|1].msum)); tree[rt].lnum=tree[rt<<1].lnum; tree[rt].rnum=tree[rt<<1|1].rnum; if(tree[rt].lnum==(tree[rt<<1].r-tree[rt<<1].l+1)) tree[rt].lnum+=tree[rt<<1|1].lnum; if(tree[rt].rnum==(tree[rt<<1|1].r-tree[rt<<1|1].l+1)) tree[rt].rnum+=tree[rt<<1].rnum; tree[rt].mnum=max(tree[rt<<1].rnum+tree[rt<<1|1].lnum,max(tree[rt<<1].mnum,tree[rt<<1|1].mnum));}inline void PushDown(int rt){ if(tree[rt].lazy){ swap(tree[rt<<1].lsum,tree[rt<<1].lnum); swap(tree[rt<<1].rsum,tree[rt<<1].rnum); swap(tree[rt<<1].msum,tree[rt<<1].mnum); swap(tree[rt<<1|1].lsum,tree[rt<<1|1].lnum); swap(tree[rt<<1|1].rsum,tree[rt<<1|1].rnum); swap(tree[rt<<1|1].msum,tree[rt<<1|1].mnum); tree[rt<<1].lazy^=1; tree[rt<<1|1].lazy^=1; tree[rt].lazy^=1; }}inline void build(int l,int r,int rt){ tree[rt].l=l; tree[rt].r=r; tree[rt].lazy=0; if(l==r) { if(num[l]){ tree[rt].lsum=tree[rt].rsum=tree[rt].msum=1; tree[rt].lnum=tree[rt].rnum=tree[rt].mnum=0; } else{ tree[rt].lsum=tree[rt].rsum=tree[rt].msum=0; tree[rt].lnum=tree[rt].rnum=tree[rt].mnum=1; } return ; } int m=(l+r)>>1; build(lson); build(rson); PushUp(rt);}inline void update(int x,int y,int rt){ int l,r; l=tree[rt].l; r=tree[rt].r; if(l==x&&r==y){ swap(tree[rt].lnum,tree[rt].lsum); swap(tree[rt].rnum,tree[rt].rsum); swap(tree[rt].mnum,tree[rt].msum); tree[rt].lazy^=1; return ; } PushDown(rt); int m=(l+r)>>1; if(x<=m) update(x,min(m,y),rt<<1); if(y>m) update(max(m+1,x),y,rt<<1|1); PushUp(rt);}inline int query(int x,int y,int rt){ int l,r; l=tree[rt].l; r=tree[rt].r; if(l==x&&r==y){ return tree[rt].msum; } PushDown(rt); int m=(l+r)>>1; if(y<=m) return query(x,y,rt<<1); else if(x>m) return query(x,y,rt<<1|1); else{ int lr=query(x,m,rt<<1); int rr=query(m+1,y,rt<<1|1); return max(max(lr,rr),min(tree[rt<<1].rsum,tree[rt<<1].r-x+1)+min(tree[rt<<1|1].lsum,y-tree[rt<<1|1].l+1)); }}inline int input(){ char c; int ret=0; c=getchar(); while(c<'0'||c>'9') c=getchar(); while(c>='0'&&c<='9') ret=ret*10+c-'0',c=getchar(); return ret;}int main(){ int n,m; while(scanf("%d",&n)!=EOF){ for(int i=1;i<=n;i++) num[i]=input(); m=input(); build(1,n,1); while(m--){ int op,a,b; op=input();a=input();b=input(); if(op==0) printf("%d\n",query(a,b,1)); else update(a,b,1); } } return 0;}
- HDU 3911
- hdu 3911
- HDU 3911
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- 你不用用那种眼神看我吧,妹的 我不就是忘记拿公牌而已吗?!!!
- Dom4j 使用简介
- Oracle 索引 详解
- 输入法分类总结与优缺点
- 网络字节序
- hdu 3911
- vi编辑器的使用
- head first--------------state pattern
- php支持json
- Struts2中OGNL,valueStack,stackContext的学习
- NYOJ-511-移动小球
- php支持json2
- python成长日记2:文件的输入输出
- 《算法竞赛入门经典》第四章小结