HDU 3911
来源:互联网 发布:win10笔记本必备软件 编辑:程序博客网 时间:2024/04/29 09:56
在这题上我WA了无数次。。。。。。
题意大概: 给你一个只包含1和0的长度为N的数列。。
然后有M个操作 每个操作前包含一个0或者1 然后是I J
如果是1就是把区间[i,j]内的所有0变成1所有1变成0
然后0就是询问区间[i,j]内最多有多少个连续的1
思路:建立一个长度为n的结构体。结构体内要存 从前开始算有多少个0 有多少个1 从后算有多少个0 有多少个1 还有就是该区间内最多的连续个1和连续个0
然后就是根据区间更新的思想来做。。。。。
贴上代码。。。
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;int m,k;struct tree{ int left; int right; int lm0,lm1,mm0,mm1,rm0,rm1; int ss; int cishu; int flag; int lazy;}tree[400000];void inset(int inst,int le,int ri){ tree[inst].left=le; tree[inst].right=ri; tree[inst].lm0=0; tree[inst].lm1=0; tree[inst].rm1=0; tree[inst].rm0=0; tree[inst].mm1=0; tree[inst].mm0=0; tree[inst].ss=2; tree[inst].cishu=0; tree[inst].flag=0; tree[inst].lazy=0; if(le==ri) return ; int mid=(le+ri)>>1; inset(2*inst,le,mid); inset(2*inst+1,mid+1,ri);}void add(int inst,int k,int l){ //cout<<tree[2].left<<endl; if(k!=tree[inst].ss) {tree[inst].cishu++; } if(tree[inst].cishu==1) { tree[inst].ss=k; if(k==1) { tree[inst].lm1++; tree[inst].mm1++; tree[inst].rm1++; } else { tree[inst].lm0++; tree[inst].mm0++; tree[inst].rm0++; } } else if(k!=tree[inst].ss) { tree[inst].ss=k; if(k==1) { tree[inst].mm1=max(tree[inst].mm1,tree[inst].rm1); tree[inst].rm1=1; tree[inst].rm0=0; tree[inst].mm1=max(tree[inst].mm1,tree[inst].rm1); } else { tree[inst].mm0=max(tree[inst].mm0,tree[inst].rm0); tree[inst].rm0=1; tree[inst].rm1=0; tree[inst].mm0=max(tree[inst].mm0,tree[inst].rm0); } } else if(k==tree[inst].ss) { if(k==1) {tree[inst].rm1++; tree[inst].mm1=max(tree[inst].mm1,tree[inst].rm1); } else {tree[inst].rm0++; tree[inst].mm0=max(tree[inst].mm0,tree[inst].rm0); } } if(tree[inst].left==tree[inst].right) return ; int mid=(tree[inst].left+tree[inst].right)>>1; if(l<=mid) add(2*inst,k,l); else add(2*inst+1,k,l);}void lazy(int inst){ swap(tree[inst].lm1,tree[inst].lm0); swap(tree[inst].mm1,tree[inst].mm0); swap(tree[inst].rm1,tree[inst].rm0);}void flag(int inst){ //cout<<inst<<" 1"<<endl; //cout<<inst<<endl; //return ; tree[inst].flag=0; if(tree[2*inst].flag!=0) flag(2*inst); if(tree[2*inst+1].flag!=0) flag(2*inst+1); //cout<<inst<<endl; tree[inst].lm1=tree[2*inst].lm1; //cout<<"lm1 "<<tree[inst].lm1<<" "<<tree[2*inst].lm1<<endl; tree[inst].lm0=tree[2*inst].lm0; //cout<<"lm0 "<<tree[inst].lm0<<" "<<tree[2*inst].lm0<<endl; tree[inst].rm1=tree[2*inst+1].rm1; //cout<<"rm1 "<<tree[inst].rm1<<" "<<tree[2*inst+1].rm1<<endl; tree[inst].rm0=tree[2*inst+1].rm0; //cout<<"rm0 "<<tree[inst].rm0<<" "<<tree[2*inst+1].rm0<<endl; tree[inst].mm1=max(tree[2*inst].mm1,max(tree[2*inst+1].mm1,tree[2*inst].rm1+tree[2*inst+1].lm1)); tree[inst].mm0=max(tree[2*inst].mm0,max(tree[2*inst+1].mm0,tree[2*inst].rm0+tree[2*inst+1].lm0)); if(tree[2*inst].lm1==(tree[2*inst].right-tree[2*inst].left+1)) tree[inst].lm1=tree[2*inst].lm1+tree[2*inst+1].lm1; if(tree[2*inst].lm0==(tree[2*inst].right-tree[2*inst].left+1)) tree[inst].lm0=tree[2*inst].lm0+tree[2*inst+1].lm0; if(tree[2*inst+1].rm1==(tree[2*inst+1].right-tree[2*inst+1].left+1)) tree[inst].rm1=tree[2*inst].rm1+tree[2*inst+1].rm1; if(tree[2*inst+1].rm0==(tree[2*inst+1].right-tree[2*inst+1].left+1)) tree[inst].rm0=tree[2*inst].rm0+tree[2*inst+1].rm0;}void fz(int inst,int le,int ri){ if(tree[inst].left==le&&tree[inst].right==ri) { //cout<<le<<" "<<ri<<endl; if(tree[inst].flag!=0) flag(inst); lazy(inst); //cout<<inst<<" "<<tree[inst].mm1<<endl; tree[inst].lazy++; return ; } else if(tree[inst].left==tree[inst].right) return ; else { //cout<<inst<<endl; //cout<<le<<" "<<ri<<endl; //cout<<tree[inst].left<<" "<<tree[inst].right<<endl; tree[inst].flag=1; } if(tree[inst].lazy%2==1) { lazy(2*inst);lazy(2*inst+1); tree[2*inst].lazy+=tree[inst].lazy; tree[2*inst+1].lazy+=tree[inst].lazy; tree[inst].lazy=0; } else tree[inst].lazy=0; int mid=(tree[inst].left+tree[inst].right)>>1; if(ri<=mid) fz(2*inst,le,ri); else if(le>mid) fz(2*inst+1,le,ri); else { fz(2*inst,le,mid); fz(2*inst+1,mid+1,ri); }}void query(int inst,int le,int ri){ if(tree[inst].left==le&&tree[inst].right==ri) { //cout<<inst<<" "<<tree[inst].mm1<<" "<<tree[inst].flag<<endl; if(tree[inst].flag!=0) flag(inst); //cout<<1<<endl; if(tree[inst].mm1==(ri-le+1)) { m=max(m,k+tree[inst].mm1); k+=tree[inst].mm1; } else { m=max(max(m,tree[inst].mm1),k+tree[inst].lm1); k=tree[inst].rm1; } return ; } else if(tree[inst].left==tree[inst].right) { if(le>=tree[inst].left&&le<=tree[inst].right||ri<=tree[inst].right&&ri>=tree[inst].left) m=tree[inst].mm1;return ; } if(tree[inst].lazy%2==1) { lazy(2*inst);lazy(2*inst+1); tree[2*inst].lazy+=tree[inst].lazy; tree[2*inst+1].lazy+=tree[inst].lazy; tree[inst].lazy=0; } else tree[inst].lazy=0; int mid=(tree[inst].left+tree[inst].right)>>1; if(ri<=mid) query(2*inst,le,ri); else if(le>mid) query(2*inst+1,le,ri); else { query(2*inst,le,mid); query(2*inst+1,mid+1,ri); }}int main(){ int n; while(scanf("%d",&n)!=EOF) { int a; inset(1,1,n); for(int i=1;i<=n;i++) { scanf("%d",&a); add(1,a,i); } /*for(int i=1;i<=7;i++) cout<<tree[i].flag<<endl;*/ int h; scanf("%d",&h); //cout<<h<<endl; while(h--) { int x,t,y; scanf("%d%d%d",&x,&t,&y); // cout<<x<<" "<<t<<" "<<y<<" "<<h<<endl; if(x==1) fz(1,t,y); else { m=0;k=0; query(1,t,y); printf("%d\n",m); } } // for(int i=1;i<=7;i++) // cout<<tree[i].left<<" "<<tree[i].right<<" "<<tree[i].mm1<<" "<<tree[i].flag<<" "<<tree[i].lm1<<" "<<tree[i].rm1<<" "<<tree[i].mm0<<" "<<tree[i].lm0<<" "<<tree[i].rm0<<endl; }}
- HDU 3911
- hdu 3911
- HDU 3911
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- glOrtho,gluOrtho2D,glFrustum,glViewport解释说明
- How do I pass a list of files to grep
- /* 求任意两个日期之间相差的天数 */
- C# 加密解密
- Linux下Android ADB驱动安装详解
- HDU 3911
- Matlab曲线拟合工具箱 cftool
- 设置虚拟服务器,外网还是无法访问怎么办
- C++网络通信编程一:基础
- Linux input子系统分析 事件传递过程
- GDI 绘图 内存泄漏问题
- C++学习笔记 之 类(一)
- 动态链接库与静态链接库
- mnesia is overloaded 及too many db tables问题总结