博客开更!!

来源:互联网 发布:补偿网络 编辑:程序博客网 时间:2024/06/07 01:12
好颓啊!!  做题好慢!! 各种错误!!

1014: [JSOI2008]火星人prefix

额 splay没啥说的 字符串hash蒟蒻不会啊 搞半天才懂 好玄学啊 unsigned的自然溢出也是玄学啊 (话说我 int的自然溢出也A了smg??

  1 #include <cstdio>  2 #include <iostream>  3 #include <algorithm>  4 #include <cstring>  5 using namespace std;  6 #define MAXN 150000+100  7 #define MO 9875321  8 int root,n,m,base[MAXN],hash[MAXN],num[MAXN],to[MAXN][2],fa[MAXN],size[MAXN],tot=0;  9 char s[MAXN]; 10 void Up(int x) 11 { 12     int L=to[x][0],R=to[x][1]; 13     size[x]=size[L]+size[R]+1; 14     hash[x]=hash[L]+num[x]*base[size[L]]+hash[R]*base[size[L]+1]; 15 } 16 void Rotate(int &rt,int x) 17 { 18     int y=fa[x],z=fa[y]; 19     if(y!=rt) to[z][to[z][1]==y]=x; 20     else rt=x; 21     fa[x]=z;fa[y]=x; 22     int c=to[y][1]==x;fa[to[x][c^1]]=y; 23     to[y][c]=to[x][c^1];to[x][c^1]=y; 24        25     Up(y);Up(x); 26 } 27 void Splay(int &rt,int x) 28 { 29     while(x!=rt) 30     { 31         if(fa[x]!=rt) Rotate(rt,fa[x]); 32         Rotate(rt,x); 33     } 34 } 35 int Find(int rt,int rank) 36 { 37     if(size[to[rt][0]]+1==rank) return rt; 38     if(size[to[rt][0]]>=rank) return Find(to[rt][0],rank); 39     return Find(to[rt][1],rank-size[to[rt][0]]-1); 40 } 41 void vist(int rt) 42 { 43     if(rt==0) return ; 44     cout<<rt<<' '<<to[rt][0]<<' '<<to[rt][1]<<' '<<size[rt]<<endl; 45     vist(to[rt][0]);vist(to[rt][1]); 46 } 47 int Do(int x,int lenth) 48 { 49     int L=Find(root,x-1),R=Find(root,x+lenth); 50     Splay(root,L);Splay(to[L][1],R); 51     return hash[to[R][0]]; 52 } 53 int Solve(int x,int y) 54 { 55     int L=0,R=min(n-x,n-y)+2; 56     while(L<R) 57     { 58         int mid=(L+R)/2; 59         if(Do(x,mid+1)==Do(y,mid+1)) L=mid+1; 60         else R=mid; 61     } 62     return L; 63 } 64 void Build(int L,int R,int last) 65 { 66     if(L>R) return ; 67     if(L==R) 68     { 69         tot++; 70         hash[tot]=num[tot]=s[L]; 71         fa[tot]=last;size[tot]=1; 72         return ; 73     } 74     int now=++tot; 75     int mid=(L+R)/2; 76     if(L<mid) {to[now][0]=tot+1; Build(L,mid-1,now); } 77     if(mid+1<=R) {to[now][1]=tot+1; Build(mid+1,R,now); } 78     num[now]=s[mid];fa[now]=last; 79     Up(now); 80 } 81 int main() 82 { 83     base[0]=1;for(int i=1;i<=150000+10;i++) base[i]=base[i-1]*27; 84     scanf("%s",s+2); 85     n=strlen(s+2);s[1]=s[n+2]=0; 86     root=tot+1; 87     Build(1,n+2,0); 88     cin>>m; 89     while(m--) 90     { 91         getchar();char c=getchar(); 92         if(c=='Q') 93         { 94             int x,y;scanf("%d %d",&x,&y); 95             printf("%d\n",Solve(x+1,y+1)); 96         } 97         else if(c=='R') 98         { 99             int x;char c;100             scanf("%d",&x);getchar();c=getchar();101             x=Find(root,x+1);102             Splay(root,x);103             num[x]=c;104             Up(x);105         }106         else107         {108             int x;char c;109             scanf("%d",&x);getchar();c=getchar();110             x++;int tmp=Find(root,x);111             Splay(root,tmp);112             int tmp1=Find(root,x+1);113             Splay(to[tmp][1],tmp1);114             to[tmp1][0]=++tot;115             num[tot]=c;116             fa[tot]=tmp1;117             Up(tot);Up(tmp1);Up(tmp);118             n++;119         }120     }121     return 0;122 }
BZOJ 1014

3223: Tyvj 1729 文艺平衡树

A过的入门题又调试半天是什么心情~~~

#include <cstdio>#include <iostream>#define maxn 100100int n,m,root,ch[maxn][2],size[maxn],fa[maxn];bool b[maxn];void Up(int x){    size[x]=size[ch[x][0]]+size[ch[x][1]]+1;}void Pushdown(int x){    if(!b[x]) return ;    std::swap(ch[x][0],ch[x][1]);    b[ch[x][0]]^=1,b[ch[x][1]]^=1;    b[x]=false;}void Rotate(int &k,int x){    int y=fa[x],z=fa[y];    if(y==k) k=x; else ch[z][ch[z][1]==y]=x;    int c=ch[y][1]==x;    fa[x]=z;fa[y]=x;fa[ch[x][c^1]]=y;    ch[y][c]=ch[x][c^1];ch[x][c^1]=y;    Up(y);Up(x);}void Splay(int &k,int x){    while(x!=k)    {        if(fa[x]!=k) Rotate(k,fa[x]);        Rotate(k,x);        }}int Find(int now,int x){    Pushdown(now);    int k=size[ch[now][0]]+1;    if(k==x) return now;    if(x>k) return Find(ch[now][1],x-k);    if(x<k) return Find(ch[now][0],x);}void F(int x,int y){    int L=Find(root,x),R=Find(root,y);    Splay(root,L),Splay(ch[L][1],R);    b[ch[R][0]]^=1;}void Dfs(int now){    if(!now) return ;    Pushdown(now);    Dfs(ch[now][0]);    if(now-1>=1&&now-1<=n)  printf("%d ",now-1);    Dfs(ch[now][1]);}int main(){    scanf("%d %d",&n,&m);root=n+2;    for(int i=1;i<=n+2;i++)        ch[i][0]=i-1,size[i]=i,fa[i]=i+1;    for(int x,y,i=1;i<=m;i++)        scanf("%d %d",&x,&y),F(x,y+2);    Dfs(root);    return 0;}
BZOJ 3223

3224: Tyvj 1728 普通平衡树

A过的入门题又调试半天是什么心情~~~

  1 #include <cstdio>  2 #include <iostream>  3 #include <cstdlib>  4 using namespace std;  5 #define maxn 100000*2+1000  6 #define INF 1000000000  7 int n,fa[maxn],ch[maxn][2],key[maxn],size[maxn],root,cnt;  8 void Up(int x)  9 { 10     size[x]=size[ch[x][0]]+size[ch[x][1]]+1; 11 } 12 void Rotate(int x) 13 { 14     int y=fa[x],z=fa[y]; 15     if(y==root) root=x; 16     else 17         ch[z][ ch[z][1]==y ]=x; 18     int c=ch[y][1]==x; 19     fa[x]=z;fa[y]=x;fa[ch[x][c^1]]=y; 20     ch[y][c]=ch[x][c^1];ch[x][c^1]=y; 21  22     Up(y),Up(x);Up(z); size[0]=0; 23 } 24 void Splay(int x) 25 { 26     while(x!=root) 27     { 28         if(fa[x]!=root) Rotate(fa[x]); 29         Rotate(x); 30     } 31 } 32 void Ins(int &now,int x,int last) 33 { 34     if(now==0){now=++cnt;key[now]=x;fa[now]=last;size[now]=1;Splay(now);} 35     else if(key[now]<x) Ins(ch[now][1],x,now); else Ins(ch[now][0],x,now); 36 } 37 int loc; 38 void Find(int now,int x) 39 { 40     if(now==0) return ; 41     if(key[now]==x) loc=now; 42     if(key[now]<=x) Find(ch[now][1],x); 43     else Find(ch[now][0],x); 44 } 45 void Del(int x) 46 { 47     Find(root,x); 48     Splay(loc); 49     if(ch[loc][0]*ch[loc][1]==0) root=ch[loc][0]+ch[loc][1]; 50     else  51     { 52         root=ch[loc][0]; 53         int tmp=ch[loc][0]; 54         while(ch[tmp][1]!=0)tmp=ch[tmp][1]; 55         ch[tmp][1]=ch[loc][1];fa[ch[loc][1]]=tmp; 56     } 57 } 58 int ans_3; 59 void F_3(int now,int x) 60 { 61     if(now==0) return ; 62     if(x<=key[now]) F_3(ch[now][0],x); 63     else ans_3+=size[ch[now][0]]+1,F_3(ch[now][1],x); 64 } 65 int ans_4; 66 void F_4(int now,int k,int sum) 67 { 68     if(now==0) return ; 69     sum+=size[ch[now][0]]+1; 70     if(sum==k){ ans_4=key[now];return;} 71     if(k<=sum) F_4(ch[now][0],k,sum-size[ch[now][0]]-1); 72     else F_4(ch[now][1],k,sum); 73 } 74 int ans_5;// qianqu 75 void F_5(int now,int x) 76 { 77     if(now==0) return ; 78     if(key[now]<x) ans_5=key[now]; 79     if(key[now]<x) F_5(ch[now][1],x); 80     else F_5(ch[now][0],x); 81 } 82 int ans_6;//houji 83 void F_6(int now,int x) 84 { 85     if(now==0) return ; 86     if(key[now]>x) ans_6=key[now]; 87     if(key[now]>x) F_6(ch[now][0],x); 88     else F_6(ch[now][1],x); 89 } 90 int main() 91 { 92     scanf("%d",&n); 93     while(n--) 94     { 95         int x,y; 96         scanf("%d %d",&x,&y); 97         switch(x) 98         { 99             case 1:Ins(root,y,root);break;100             case 2:Del(y);break;101             case 3:ans_3=1; 102                    F_3(root,y);103                    printf("%d\n",ans_3);104                    break;105             case 4:ans_4=0;106                    F_4(root,y,0);107                    printf("%d\n",ans_4);108                    break;109             case 5:F_5(root,y);110                    printf("%d\n",ans_5);111                    break;112             case 6:F_6(root,y);113                    printf("%d\n",ans_6);114                    break;      115         }116     }117     return 0;118 }
BZOJ 3224

1251: 序列终结者

区间操作烦死人啊!!! 注意各种标记的下传时间!! 

 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 #define MAXN 100000 7 int tot,root,n,m,fa[MAXN],size[MAXN],num[MAXN],to[MAXN][2],add[MAXN],mmax[MAXN]; 8 bool mark[MAXN]; 9 void Up(int x)10 {11     int l=to[x][0],r=to[x][1];12     size[x]=size[to[x][0]]+size[to[x][1]]+1;13     mmax[x]=max(num[x],max(mmax[l],mmax[r]));14 }15 void P(int x) //Pushdown()16 {17     if(x==0) return ;18     int l=to[x][0],r=to[x][1],tmp=add[x];19     if(mark[x]) swap(to[x][0],to[x][1]),mark[l]^=1,mark[r]^=1,mark[x]=false;20     add[l]+=tmp;add[r]+=tmp;21     num[l]+=tmp;num[r]+=tmp;22     mmax[l]+=tmp;mmax[r]+=tmp;23     add[x]=0,mmax[0]=-100000000;24 }25 void Rotate(int x,int &rt)26 {27     int y=fa[x],z=fa[y];28     P(y);P(x);29     if(y==rt) rt=x;30     else to[z][to[z][1]==y]=x;31     int c=to[y][1]==x;32     fa[x]=z;fa[y]=x;fa[to[x][c^1]]=y;33     to[y][c]=to[x][c^1];to[x][c^1]=y;34     Up(y);Up(x);35 }36 void Splay(int x,int &rt){while(x!=rt){if(fa[x]!=rt)Rotate(fa[x],rt);37 Rotate(x,rt);}}38 int Find(int rank,int rt)39 {40     P(rt);41     int tmp=size[to[rt][0]]+1;42     if(tmp==rank)return rt;43     if(tmp>rank) return Find(rank,to[rt][0]);44     return Find(rank-tmp,to[rt][1]);45 }46 int F(int l,int r)47 {   48     l=Find(l,root),r=Find(r,root);49     Splay(l,root);Splay(r,to[l][1]);50     return to[r][0];51 }52 void Build(int lenth)53 {54     tot++;size[tot]=1;55     for(int i=2;i<=lenth;i++)56     {57         tot++;58         size[tot]=size[tot-1]+1;59         fa[tot-1]=tot;60         to[tot][0]=tot-1;61     }62     root=tot;63 }64 int main()65 {66     scanf("%d %d",&n,&m);67     Build(n+2);68     int opt,l,r,x,tmp;69     while(m--)70     {71         scanf("%d %d %d",&opt,&l,&r);72         switch (opt)73         {74             case 1:scanf("%d",&x);tmp=F(l,r+2);num[tmp]+=x;add[tmp]+=x;mmax[tmp]+=x;break;75             case 2:mark[F(l,r+2)]^=1;break;76             case 3:printf("%d\n",mmax[F(l,r+2)]);break;77         }78     }79     return 0;80 }
BZOJ 1251

1503: [NOI2004]郁闷的出纳员

直接搞就行

 1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 #define MAXN 100000+10 5 int tot,ans,nn,n,m,mmin,root,fa[MAXN],size[MAXN],to[MAXN][2],num[MAXN],add[MAXN]; 6 void Up(int x){size[x]=size[to[x][0]]+size[to[x][1]]+1;} 7 void Rotate(int &rt,int x) 8 { 9     int y=fa[x],z=fa[y];10     if(y==rt) rt=x;11     else to[z][to[z][1]==y]=x;12     int c=to[y][1]==x;13     fa[x]=z;fa[y]=x;fa[to[x][c^1]]=y;14     to[y][c]=to[x][c^1];to[x][c^1]=y;15     Up(x);Up(y);16 }17 void Splay(int &rt,int x){while(rt!=x){if(fa[x]!=rt)Rotate(rt,fa[x]);Rotate(rt,x);}}18 void Pushdown(int x)19 {20     if(add[x]==0) return ;21     int l=to[x][0],r=to[x][1],tmp=add[x];22     num[l]+=tmp;num[r]+=tmp;23     add[l]+=tmp;add[r]+=tmp;24     add[x]=0;add[0]=0;num[0]=0;25 }26 int Rank(int rt,int rk)27 {28     Pushdown(rt);29     int tmp=size[to[rt][0]]+1;30     if(tmp==rk)return num[rt];31     if(tmp<rk)return Rank(to[rt][1],rk-tmp);32     return Rank(to[rt][0],rk);33 }34 void Find(int rt)35 {36     if(rt==0) return ;37     Pushdown(rt);38     if(num[rt]<0) ans=rt,Find(to[rt][1]);39     else Find(to[rt][0]);40 }41 void Delate()42 {43     ans=0;Find(root);44     if(ans==0)return ;45     Splay(root,ans);n-=size[to[root][0]]+1;nn+=size[to[root][0]]+1;root=to[root][1];46 }47 void Ins(int &rt,int x,int last)48 {49     if(rt==0){n++;tot++;rt=tot;fa[rt]=last;size[rt]=1;num[rt]=x;Splay(root,rt);return ;}50     Pushdown(rt);51     if(num[rt]<x) Ins(to[rt][1],x,rt);52     else Ins(to[rt][0],x,rt);53 }54 int main()55 {56     scanf("%d %d",&m,&mmin);57     char c;int x;58     while(m--)59     {60         getchar();c=getchar();scanf("%d",&x);61         switch(c)62         {63             case 'I':if(mmin<=x) Ins(root,x-mmin,root);break;64             case 'A':num[root]+=x;add[root]+=x;break;65             case 'S':num[root]-=x;add[root]-=x;Delate();break;66             case 'F':if(x>n) ans=-1;else ans=Rank(root,n-x+1)+mmin;printf("%d\n",ans);break;67         }68     }69     printf("%d\n",nn);70     return 0;71 }
BZOJ 1503

3506: [Cqoi2014]排序机械臂

这个比较水 可以自己想的 而且双倍经验很爽(hah 另一个PE是很爽)啊!!

 1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 #define MAXN 100000+10 5 int n,root,tot,fa[MAXN],size[MAXN],to[MAXN][2]; 6 bool mark[MAXN]; 7 struct H{int id,num;}a[MAXN]; 8 bool cmp(H a,H b){if(a.num==b.num)return a.id<b.id;return a.num<b.num;} 9 void Up(int x){size[x]=size[to[x][0]]+size[to[x][1]]+1;}10 void Pushdown(int x)11 {12     if(!mark[x]) return ;13     int l=to[x][0],r=to[x][1];14     swap(to[x][0],to[x][1]);15     mark[l]^=1;mark[r]^=1;16     mark[x]=false;17 }18 void Rotate(int &rt,int x)19 {20     int y=fa[x],z=fa[y];21     Pushdown(y);Pushdown(x);22     if(y==rt) rt=x;23     else to[z][to[z][1]==y]=x;24     int c=to[y][1]==x;25     fa[y]=x;fa[x]=z;fa[to[x][c^1]]=y;26     to[y][c]=to[x][c^1];to[x][c^1]=y;27     Up(y);Up(x);28 }29 void Splay(int &rt,int x){while(x!=rt){if(fa[x]!=rt)Rotate(rt,fa[x]);Rotate(rt,x);}}30 void Build()31 {32     tot++;size[tot]=1;33     for(int i=1;i<=n+1;i++)34     {35         tot++;fa[tot-1]=tot;36         to[tot][0]=tot-1;37         size[tot]=tot;38     }39     root=tot;40 }41 int main()42 {43     scanf("%d",&n);Build();44     for(int i=1;i<=n;i++) scanf("%d",&a[i].num),a[i].id=i+1;45     sort(a+1,a+n+1,cmp);46     a[0].id=1;47     for(int i=1;i<=n;i++)48     {49         Splay(root,a[i].id);50         printf("%d ",size[to[root][0]]);51         Pushdown(root);int tmp=to[root][1];Pushdown(tmp);52         while(to[tmp][0]!=0) tmp=to[tmp][0],Pushdown(tmp);53         Splay(root,tmp);54         Splay(to[root][0],a[i-1].id);55         mark[to[a[i-1].id][1]]^=1;56     }57     return 0;58 }
BZOJ 3506

1500: [NOI2005]维修数列

嗯~ 码农题

不错 写完过样例 交上去试试吧 WA WA WA . . . . . .

vijos终于AC 嗯 交到BZOJ去吧

TLE ? wco 卡内存!! 你什么心态啊!! 64MB怎么耍??

一晚没调出来 早上又改了 内存回收 hah 终于可以了吧

TLE ? woc 卡时间!! 题目明明3s BZOJ限制1s 什么心态啊!!

于是 读入优化+把splay链的情况改成树 终于AC

 第一个Ac是hzwer的 后面的AC是被卡时卡内存的

A了这个题整个人都不好了!! 平衡树就这样吧!!

  1 #include <iostream>  2 #include <cstdio>  3 #include <algorithm>  4 #include <cstring>  5 using namespace std;  6 #define N 1000000+100  7 #define L(x) to[x][0]  8 #define R(x) to[x][1]  9 #define I inline  10 int n,m,init[N],fa[N],to[N][2],root,size[N],mx[N],ml[N],mr[N],sum[N],num[N],top,q[N]; 11 bool mark[N],ch[N]; 12 I int Read() 13 { 14     char c=getchar(); 15     int tmp=0,t=1; 16     while(c!='-'&&(c<'0'||c>'9')) c=getchar(); 17     if(c=='-') t=-1,c=getchar(); 18     while('0'<=c&&c<='9') tmp=tmp*10+c-'0',c=getchar(); 19     return tmp*t; 20 }  21 I void Up(int x) 22 { 23     int l=L(x),r=R(x); 24     size[x]=size[l]+size[r]+1; 25     sum[x]=sum[l]+sum[r]+num[x]; 26     mx[x]=max(max(mx[l],mx[r]),ml[l]+num[x]+mr[r]); 27     ml[x]=max(ml[r],sum[r]+num[x]+ml[l]); 28     mr[x]=max(mr[l],sum[l]+num[x]+mr[r]); 29 } 30 I void Pushdown(int x) 31 { 32     int l=L(x),r=R(x); 33     if(ch[x]==true) 34     { 35         num[l]=num[r]=num[x]; 36         sum[l]=size[l]*num[x]; 37         sum[r]=size[r]*num[x]; 38         if(num[x]<0) ml[l]=ml[r]=mr[l]=mr[r]=0,mx[l]=mx[r]=num[x]; 39         else mx[l]=ml[l]=mr[l]=sum[l],mx[r]=ml[r]=mr[r]=sum[r]; 40         ch[l]=ch[r]=true; 41         sum[0]=ml[0]=mr[0]=0; 42         mx[0]=-100000000; 43         ch[x]=mark[x]=false; 44     } 45     if(mark[x]) 46     { 47         mark[x]=false; 48         mark[l]^=1;mark[r]^=1; 49         swap(L(l),R(l));swap(L(r),R(r)); 50         swap(ml[l],mr[l]);swap(ml[r],mr[r]); 51     } 52 } 53 I void Rotate(int &rt,int x) 54 { 55     int y=fa[x],z=fa[y];  56     if(y==rt) rt=x; 57     else to[z][to[z][1]==y]=x; 58     int c=to[y][1]==x; 59     fa[x]=z;fa[y]=x;fa[to[x][c^1]]=y; 60     to[y][c]=to[x][c^1];to[x][c^1]=y; 61     Up(y);Up(x); 62 } 63 I void Splay(int &rt,int x) 64 { 65     while(x!=rt) 66     { 67         if(fa[x]!=rt) Rotate(rt,fa[x]); 68         Rotate (rt,x); 69     } 70 } 71 I int Find(int rt,int x) 72 { 73     Pushdown(rt); 74     int tmp=size[L(rt)]+1; 75     if(tmp==x)return rt; 76     if(tmp<x)return Find(R(rt),x-tmp); 77     else return Find(L(rt),x); 78 } 79 I void Build(int l,int r) 80 { 81  82     int mid=(l+r)/2; 83     int t=q[top--]; 84     num[t]=init[mid]; 85     if(l<mid) to[t][0]=q[top],fa[q[top]]=t,Build(l,mid-1); 86     if(mid<r) to[t][1]=q[top],fa[q[top]]=t,Build(mid+1,r); 87     Up(t); 88 } 89 I void Insert(int x,int lenth) 90 { 91     int y=Find(root,x+1);x=Find(root,x); 92     Splay(root,x);Splay(R(x),y); 93     for(int i=1;i<=lenth;i++) 94         init[i]=Read(); 95     L(y)=q[top];fa[q[top]]=y; 96     Build(1,lenth); 97     Up(y);Up(x); 98 } 99 I void Dfs(int x)100 {101     if(x==0)return ;102     Dfs(L(x));Dfs(R(x));103     size[x]=num[x]=fa[x]=L(x)=R(x)=sum[x]=ml[x]=mr[x]=mx[x]=0;104     mark[x]=ch[x]=false;105     q[++top]=x;106 }107 I void Delate(int x,int lenth)108 {109     int y=Find(root,x+lenth);x=Find(root,x-1);110     Splay(root,x);Splay(R(x),y);111     Dfs(L(y));L(y)=0;Up(y);Up(x);112 }113 I void Change(int x,int lenth,int t)114 {115     int y=Find(root,x+lenth);x=Find(root,x-1);116     Splay(root,x);Splay(R(x),y);117     int tmp=L(y);num[tmp]=t;ch[tmp]=true;sum[tmp]=size[tmp]*t;118     if(t<0) ml[tmp]=mr[tmp]=0,mx[tmp]=t;119     else ml[tmp]=mr[tmp]=mx[tmp]=sum[tmp];120     Up(y);Up(x);121 }122 I void Evert(int x,int lenth)123 {124     int y=Find(root,x+lenth);x=Find(root,x-1);125     Splay(root,x);Splay(R(x),y);126     int tmp=L(y);127     mark[tmp]^=1;swap(L(tmp),R(tmp)),swap(ml[tmp],mr[tmp]);128     Up(y),Up(x); 129 }130 I int Sum(int x,int lenth)131 {132     int y=Find(root,x+lenth);x=Find(root,x-1);133     Splay(root,x);Splay(R(x),y);134     return sum[L(y)];135 }136 int main()137 {138     scanf("%d %d",&n,&m);mx[0]=-100000000;139     for(int i=1;i<=1000000;i++) q[i]=1000000-i+1;top=1000000;140     top-=2;fa[1]=2;to[2][0]=1;size[1]=1;size[2]=2;root=2;num[1]=num[2]=-100000000;Up(1);Up(2);141     Insert(1,n);142     char s[200];int x,y,z;143     while(m--)144     {145         scanf("%s",s+1);146         switch(s[3])147         {148             case 'S':x=Read();y=Read();Insert(x+1,y);break;149             case 'L':x=Read();y=Read();Delate(x+1,y);break;150             case 'K':x=Read();y=Read();z=Read();Change(x+1,y,z);break;151             case 'V':x=Read();y=Read();Evert(x+1,y);break;152             case 'T':x=Read();y=Read();printf("%d\n",Sum(x+1,y));break;153             case 'X':printf("%d\n",mx[root]);break;154         }155     }156     return 0;157 }
BZOJ 1500

1507: [NOI2003]Editor

由于1500留下的阴影 这个题弃疗~

2002: [Hnoi2010]Bounce 弹飞绵羊

分块水过 但LCT都好玄学啊 网上的题解都换根了(虽然又换回来 但不能理解啊) 于是蒟蒻写了个 没有换根的 少个Up 调试半天 ~

 1 #include <cstdio> 2 #include <cmath> 3 #define MAXN 400000+10 4 int n,m,num[MAXN],pos[MAXN],to[MAXN],ans[MAXN]; 5 void Updata(int L,int R) 6 { 7     for(int i=R;i>=L;i--) 8     { 9         if(num[i]+i<=n&&pos[num[i]+i]==pos[i]) 10             to[i]=to[i+num[i]],ans[i]=ans[i+num[i]]+1;11         else12             to[i]=i,ans[i]=0;13     }14 }15 int Q(int x)16 {17     int r=0;18     while(x+num[x]<=n)19     {20         if(to[x]==x) r+=1,x=x+num[x];21         else  r+=ans[x],x=to[x];22     }23     return r;24 }25 int main()26 {27     scanf("%d",&n);int L=sqrt(n);28     for(int i=1;i<=n;i++) scanf("%d",&num[i]),pos[i]=i/L+1;29     for(int i=L-1;i<=n;i+=L) Updata(i/L*L,i);Updata(n/L*L,n);30     scanf("%d",&m); int x,y,z;31     while(m--)32     {33         scanf("%d",&x);34         if(x==1) scanf("%d",&y),printf("%d\n",Q(y+1)+1);35         else scanf("%d %d",&y,&z),y++,num[y]=z,Updata(y/L*L,y);36     }37     return 0;38 }
BZOJ 2002 分块
 1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 #include <iostream> 5 using namespace std; 6 #define N 200000+10 7 int n,m,num[N],fa[N],to[N][2],ans[N],size[N]; 8 bool mark[N]; 9 void Up(int x)10 {11     size[x]=size[to[x][0]]+size[to[x][1]]+1;12 }13 bool Isroot(int x)14 {15     return to[fa[x]][0]!=x&&to[fa[x]][1]!=x;16 }17 void Rotate(int x)18 {19     int y=fa[x],z=fa[y];20     if(!Isroot(y)) to[z][to[z][1]==y]=x;21     int c=to[y][1]==x;22     fa[x]=z;fa[y]=x;fa[to[x][c^1]]=y;23     to[y][c]=to[x][c^1];to[x][c^1]=y;24     Up(y);Up(x);25 }26 void Splay(int x)27 {28     if(!x)return ;29     while(!Isroot(x))30     {31         if(!Isroot(fa[x])) Rotate(fa[x]);32         Rotate(x);33     }34 }35 void Access(int x)36 {37     int t=0;38     while(x)39     {40         Splay(x);41         to[x][1]=t;42         t=x;Up(x);43         x=fa[x];44     }45 }46 int main()47 {48     cin>>n;49     for(int i=1;i<=n;i++) 50     {51         int x; 52         scanf("%d",&x);53         if(x+i<=n) fa[i]=x+i;54     }55     cin>>m;56     while(m--)57     {58         int opt,x,y;59         scanf("%d",&opt);60         switch(opt)61         {62             case 1:scanf("%d",&x);x++;Access(x);Splay(x);printf("%d\n",size[x]);break;63             case 2:scanf("%d %d",&x,&y);x++;64                    Access(x);Splay(x);fa[to[x][0]]=0;65                    to[x][0]=0; 66                    if(x+y<=n)fa[x]=x+y;67                    else fa[x]=0;68                     69                    break;70         }71     }72     return 0;73 } 
BZOJ 2002 LCT

2049: [Sdoi2008]Cave 洞穴勘测

读题不认真 不然早A了 居然没有看见是树的条件

 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstring> 5 using namespace std; 6 #define N 10000+10 7 int fa[N],to[N][2],n,m; 8 bool mark[N]; 9 bool Is(int x)10 {11     return to[fa[x]][0]!=x&&to[fa[x]][1]!=x;12 }13 void Pushdown(int x)14 {15     if(!mark[x]) return ;16     mark[x]=false;17     swap(to[x][0],to[x][1]);18     mark[to[x][0]]^=1;19     mark[to[x][1]]^=1;20 }21 void Rotate(int x)22 {23     int y=fa[x],z=fa[y];24     Pushdown(y);Pushdown(x);25     if(!Is(y)) to[z][to[z][1]==y]=x;26     int c=to[y][1]==x;27     fa[x]=z;fa[y]=x;fa[to[x][c^1]]=y;28     to[y][c]=to[x][c^1];to[x][c^1]=y;29 }30 void Splay(int x)31 {32     Pushdown(x);33     while(!Is(x))34     {35         if(!Is(fa[x])) Rotate(fa[x]);36         Rotate(x);37     }38 }39 void Access(int x)40 {41     int t=0;42     while(x)43     {44         Splay(x);45         to[x][1]=t;46         t=x;47         x=fa[x];48     }49 }50 void Markroot(int x)51 {52     Access(x);Splay(x);mark[x]^=1;53 }54 int Find(int x)55 {56     Access(x);Splay(x);57     while(to[x][0]!=0) x=to[x][0];58     return x;59 }60 void Cut(int x,int y)61 {62     Markroot(x);Access(y);Splay(y);63     to[y][0]=fa[x]=0;64 }65 void Link(int x,int y)66 {67     Markroot(x);fa[x]=y;68 }69 int main()70 {71     scanf("%d %d",&n,&m);72     char s[10];int x,y;73     while(m--)74     {75         scanf("%s %d %d",s,&x,&y);76         switch(s[0])77         {78             case 'Q':if(Find(x)==Find(y)) printf("Yes\n");else printf("No\n");break;79             case 'C':Link(x,y);break;80             case 'D':Cut(x,y);break;81         }82     }83     return 0;84 }
BZOJ 2049

3669: [Noi2014]魔法森林

好神啊!!  

  1 #include <iostream>  2 #include <algorithm>  3 #include <cstring>  4 #include <cstdio>  5 using namespace std;  6 #define N 50000+10  7 #define M 100000+10  8 #define INF 1000000000  9 #define l(x) to[x][0] 10 #define r(x) to[x][1] 11 int num[N+M],fa[N+M],to[N+M][2],mmax[N+M]; 12 bool mark[N+M];  13 int f[N]; 14 int Find(int x) 15 { 16     if(f[x]!=x) f[x]=Find(f[x]); 17     return f[x];  18 } 19 int n,m; 20 struct H{int x,y;int a,b;}init[M]; 21 bool cmp(H x,H y){return x.a<y.a;} 22 int ans=INF; 23 void Up(int x) 24 { 25     int l=to[x][0],r=to[x][1]; 26     if(num[mmax[l]]>num[mmax[r]]) mmax[x]=mmax[l]; 27     else mmax[x]=mmax[r]; 28     if(num[x]>num[mmax[x]]) mmax[x]=x; 29 } 30 void Pushdown(int x) 31 { 32     if(!mark[x]) return ; 33     mark[x]=false; 34     swap(l(x),r(x)); 35     mark[l(x)]^=1; 36     mark[r(x)]^=1; 37 } 38 bool Is(int x) 39 { 40     return l(fa[x])!=x&&r(fa[x])!=x;     41 } 42 void Rotate(int x) 43 { 44     int y=fa[x],z=fa[y]; 45     Pushdown(y);Pushdown(x); 46     if(!Is(y)) to[z][to[z][1]==y]=x; 47     int c=to[y][1]==x; 48     fa[x]=z;fa[y]=x;fa[to[x][c^1]]=y; 49     to[y][c]=to[x][c^1];to[x][c^1]=y; 50     Up(y);Up(x); 51 } 52 void Splay(int x) 53 { 54     Pushdown(x); 55     while(!Is(x)) 56     { 57         if(!Is(fa[x])) Rotate(fa[x]); 58         Rotate(x); 59     } 60 } 61 void Access(int x) 62 { 63     int t=0; 64     while(x) 65     { 66         Splay(x); 67         to[x][1]=t; 68         t=x;Up(x); 69         x=fa[x]; 70     } 71 } 72 void Markroot(int x) 73 { 74     Access(x);Splay(x);mark[x]^=1; 75 } 76 void Link(int x,int y) 77 { 78     Markroot(x);fa[x]=y; 79 } 80 void Cut(int x,int y) 81 { 82     Markroot(x);Access(y);Splay(y); 83     l(y)=fa[x]=0; 84 } 85 int Sum(int x,int y) 86 { 87     Markroot(x);Access(y);Splay(y); 88     return mmax[y]; 89 } 90 int main() 91 { 92     cin>>n>>m; 93     for(int i=1;i<=n;i++) f[i]=i; 94     for(int i=1;i<=m;i++) scanf("%d %d %d %d",&init[i].x,&init[i].y,&init[i].a,&init[i].b); 95     sort(init+1,init+1+m,cmp); 96     for(int i=1;i<=m;i++) 97     { 98         int x=init[i].x,y=init[i].y,a=init[i].a,b=init[i].b; 99         if(Find(x)==Find(y))100         {101             int v=Sum(x,y);102             if(num[v]>b)103             {104                 Cut(v,init[v-n].x);105                 Cut(v,init[v-n].y);106                 v=n+i;107                 num[v]=b;108                 Link(v,x);109                 Link(v,y);110             }    111         }112         else113         {114             f[Find(x)]=Find(y);115             int v=n+i;116             num[v]=b;117             Link(v,x);118             Link(v,y);119         }120         if(Find(1)==Find(n)) ans=min(ans,a+num[Sum(1,n)]);121     }122     if(Find(1)!=Find(n)) cout<<"-1";123     else cout<<ans;124     return 0;125 } 
BZOJ 3669

2631: tree

是双倍经验吗 差不多 和另一个挺像 忘记题号了 

我的Up Pushdown 惨不忍睹!!

  1 #include <cstdio>  2 #include <iostream>  3 #include <algorithm>  4 #include <cstdio>  5 #include <cstring>  6 using namespace std;  7 #define N 100000+10  8 #define MO 51061   9 #define LL unsigned 10 LL fa[N],to[N][2],num[N],sum[N],jx[N],ig[N],size[N]; 11 bool mark[N]; 12 LL n,m; 13 void Pushdown(LL x) 14 { 15     LL l=to[x][0],r=to[x][1];   16     ig[l]*=ig[x];ig[r]*=ig[x];         ig[l]%=MO;ig[r]%=MO; 17     num[l]*=ig[x];num[r]*=ig[x];     num[l]%=MO;num[r]%=MO;  18     num[l]+=jx[x];num[r]+=jx[x];    num[l]%=MO;num[r]%=MO; 19     sum[l]*=ig[x];sum[r]*=ig[x];    sum[l]%=MO; sum[r]%=MO; 20     sum[l]+=(size[l]*jx[x])%MO;    sum[l]%=MO; 21     sum[r]+=(size[r]*jx[x])%MO;  sum[r]%=MO; 22     jx[l]*=ig[x];jx[r]*=ig[x];  jx[l]%=MO; jx[r]%=MO; 23      24     jx[l]+=jx[x];jx[r]+=jx[x];  jx[l]%=MO; jx[r]%=MO; 25     jx[x]=0;ig[x]=1;sum[0]=0; 26      27     if(!mark[x]) return ; 28     mark[x]=false; 29     mark[l]^=1;mark[r]^=1; 30     swap(to[x][1],to[x][0]); 31 } 32 void Up(LL x) 33 { 34     LL l=to[x][0],r=to[x][1]; 35     sum[x]=(sum[l]+sum[r]+num[x])%MO; 36     size[x]=(size[l]+size[r]+1)%MO; 37 } 38 bool Isroot(LL x) 39 { 40     return to[fa[x]][0]!=x&&to[fa[x]][1]!=x; 41 } 42 void Rotate(LL x) 43 { 44     LL y=fa[x],z=fa[y]; 45     Pushdown(y);Pushdown(x); 46     if(!Isroot(y)) to[z][to[z][1]==y]=x; 47     LL c=to[y][1]==x; 48     fa[x]=z;fa[y]=x;fa[to[x][c^1]]=y; 49     to[y][c]=to[x][c^1];to[x][c^1]=y; 50     Up(y);Up(x); 51 } 52 void Splay(LL x) 53 { 54     Pushdown(x); 55     while(!Isroot(x)) 56     { 57         if(!Isroot(fa[x]))  Rotate(fa[x]); 58         Rotate(x); 59     } 60 }  61 void Access(LL x) 62 { 63     LL t=0; 64     while(x!=0) 65     { 66         Splay(x); 67         to[x][1]=t; 68         t=x;Up(x); 69         x=fa[x]; 70     } 71 } 72 void Markroot(LL x) 73 { 74     Access(x);Splay(x);mark[x]^=1; 75 } 76 int main() 77 { 78     scanf("%d %d",&n,&m);for(LL i=1;i<=n;i++) ig[i]=sum[i]=num[i]=1,size[i]=1; 79     for(LL i=1;i<n;i++) 80     { 81         LL x,y;scanf("%d %d",&x,&y); 82         Markroot(x);fa[x]=y; 83     } 84     LL x,y,z,x1,y1; 85     char c; 86     while(m--) 87     { 88         getchar(); 89         c=getchar(); 90         switch(c) 91         { 92             case '+':scanf("%d %d %d",&x,&y,&z);Markroot(x);Access(y);Splay(y);z%=MO;sum[y]+=(z*size[y])%MO;sum[y]%=MO;num[y]+=z;num[y]%=MO;jx[y]+=z;jx[y]%=MO;break; 93             case '-':scanf("%d %d %d %d",&x,&y,&x1,&y1); 94                      Markroot(x);Access(y);Splay(y); 95                      to[y][0]=fa[x]=0; 96                      Markroot(x1);fa[x1]=y1; 97                      break; 98             case '*':scanf("%d %d %d",&x,&y,&z);z%=MO;Markroot(x);Access(y);Splay(y);jx[y]*=z;jx[y]%=MO;sum[y]*=z;sum[y]%=MO;num[y]*=z;num[y]%=MO;ig[y]*=z;ig[y]%=MO;break; 99             case '/':scanf("%d %d",&x,&y);Markroot(x);Access(y);Splay(y);printf("%d\n",sum[y]);break;100         }101     }102     return 0;103 }
BZOJ 2631

 

 

差不多了 平衡树 lct 先这样吧 还有一些 写这些题目时的双倍经验 或 模板题 没有贴

 

0 0
原创粉丝点击