题意:点我
我就想问,现在换代码风格还来得及吗?
1 #include<cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define mid (l+r)/2 5 #define ls rt<<1,l,mid 6 #define rs rt<<1|1,mid+1,r 7 using namespace std; 8 const int Rn=199999+9; 9 int N,Q; 10 struct Node 11 { 12 int lc,rc; //左右两端颜色 13 int ln,rn; //左右两边长度 14 int val; //长度 15 }T[Rn<<2]; 16 void pushup(int rt,int l,int r) 17 { 18 Node &x1=T[rt],x2=T[rt<<1],x3=T[rt<<1 | 1]; 19 x1.lc=x2.lc; 20 x1.rc=x3.rc; 21 x1.ln=x2.ln; 22 x1.rn=x3.rn; 23 x1.val=max(x2.val,x3.val); 24 if(x2.rc!=x3.lc) 25 { 26 x1.val=max(x1.val,x2.rn+x3.ln); 27 if(x2.val==mid-l+1){ 28 x1.ln=x2.val+x3.ln; 29 } 30 if(x3.val==r-mid){ 31 x1.rn=x3.val+x2.rn; 32 } 33 } 34 35 } 36 void build(int rt,int l,int r) 37 { 38 Node &S=T[rt]; 39 S.lc=S.rc=S.ln=S.rn=S.val=1; 40 if(l==r) 41 { 42 return; 43 } 44 build(ls); 45 build(rs); 46 } 47 48 void update(int rt,int l,int r,int x) 49 { 50 if(l==r) 51 { 52 T[rt].lc=T[rt].rc=T[rt].lc^1; 53 return; 54 } 55 if(x<=mid) 56 { 57 update(ls,x); 58 } 59 if(x>mid) 60 { 61 update(rs,x); 62 } 63 pushup(rt,l,r); 64 } 65 66 int main() 67 { 68 #ifndef ONLINE_JUDGE 69 freopen("1.in","r",stdin); 70 #endif 71 int x; 72 scanf("%d%d",&N,&Q); 73 build(1,1,N); 74 for(int i=0;i<Q;i++) 75 { 76 scanf("%d",&x); 77 update(1,1,N,x); 78 printf("%d\n",T[1].val); 79 } 80 return 0; 81 82 }
时间: 2024-10-22 08:20:16