维修数列

维修数列

  快要省选了!应该做一点数据结构题练练码力,但是又不想一直码码码,所以就有了这个奇怪的"七天写完维修数列"。

  维修数列有六个操作,一天写一个,万一出现了什么意外情况,七天应该也是可以写完的吧...

  2.28:

  写了一些基础操作:build,splay,totate,update,insert。

  
  1 # include <cstdio>
  2 # include <iostream>
  3 # include <cstring>
  4 # define R register int
  5 # define nl (n<<1)
  6 # define nr (n<<1|1)
  7 
  8 using namespace std;
  9 
 10 const int maxn=4500006;
 11 int n,m,x,rt,cnt,a[500005],x,pos,k;
 12 int ch[maxn][2],siz[maxn],f[maxn],s[maxn],v[maxn];
 13 char opt[15];
 14 
 15 int read();
 16 int build (int n,int l,int r);
 17 int splay (int x,int g);
 18 void rotate (int x);
 19 int D (int x);
 20 int find (int x);
 21 void makelr (); //创建左右哨兵,以防splay为空时操作出错
 22 void ins (int x,int pos);
 23 
 24 int main()
 25 {
 26     n=read(),m=read();
 27     for (R i=1;i<=n;++i) a[i]=read();
 28     rt=build(1,1,n);
 29     makelr();
 30     for (R i=1;i<=m;++i)
 31     {
 32         scanf("%s",s+1);
 33         if(s[1]=='I')
 34         {
 35             pos=read(),k=read();
 36             for (R j=1;j<=k;++j)
 37                 x=read(),ins(x,pos+j);
 38         }
 39         else if(s[1]=='D')
 40         {
 41             pos=read(),k=read();
 42         }
 43         else if(s[1]=='M'&&s[3]=='K')
 44         {
 45             pos=read(),k=read(),x=read();
 46         }
 47         else if(s[1]=='R')
 48         {
 49             pos=read(),k=read();
 50         }
 51         else if(s[1]=='G')
 52         {
 53             pos=read(),k=read();
 54         }
 55         else
 56         {
 57 
 58         }
 59     }
 60     return 0;
 61 }
 62 
 63 int find (int k)
 64 {
 65     int x=rt;
 66     while(1)
 67     {
 68         int s=siz[ ch[x][0] ];
 69         if(s>=k) x=ch[x][0];
 70         else if(s+1==k) return x;
 71         else x=ch[x][1],k-=s+1;
 72     }
 73     return -1;
 74 }
 75 
 76 void rotate (int x)
 77 {
 78     int F=f[x],g=f[F];
 79     int dx=D(x),df=D(f);
 80     int k=ch[x][dx^1];
 81     ch[F][dx]=k;
 82     ch[x][dx^1]=F;
 83     ch[g][df]=x;
 84     f[k]=F,f[F]=x,f[x]=g;
 85     update(k),update(F),update(x);
 86 }
 87 
 88 void splay (int x,int g)
 89 {
 90     while(f[x]!=g)
 91     {
 92         if(f[ f[x] ]==g) rotate(x);
 93         else if(D(x)==D(f[x])) rotate(f[x]),rotate(x);
 94         else rotate(x),rotate(x);
 95     }
 96     if(g==0) rt=x;
 97 }
 98 
 99 void makelr ()
100 {
101     int x=find(1);
102     splay(x,0);
103     ch[x][0]=++cnt;
104     f[cnt]=x;
105     siz[cnt]=1;
106     update(x);
107     x=find(n+1);
108     splay(x,0);
109     ch[x][1]=++cnt;
110     f[cnt]=x;
111     siz[cnt]=1;
112     update(x);
113 }
114 
115 int D (int x) { return ch[ f[x] ][1]==x; }
116 
117 void update (int n)
118 {
119     int l=ch[n][0],r=ch[n][1];
120     s[n]=s[l]+s[r]+v[n];
121     siz[n]=siz[l]+siz[r]+1;
122 }
123 
124 int build (int l,int r)
125 {
126     if(r>l) return 0;
127     if(l==r)
128     {
129         siz[++cnt]=1;
130         v[cnt]=a[l];
131         s[cnt]=a[l];
132         return cnt;
133     }
134     int mid=(l+r)>>1;
135     ch[++cnt][0]=build(l,mid-1);
136     ch[cnt][1]=build(mid+1,r);
137     f[ ch[cnt][0] ]=cnt;
138     f[ ch[cnt][1] ]=cnt;
139     v[cnt]=a[mid];
140     update(cnt);
141     return cnt;
142 }
143 
144 void ins (int x,int pos)
145 {
146     int l=find(pos),r=find(pos+1);
147     splay(l,0),splay(r,l);
148     f[++cnt]=r;
149     ch[r][0]=cnt;
150     v[cnt]=s[cnt]=x;
151     siz[cnt]=1;
152     update(r);
153     update(l);
154 }
155 
156 int read()
157 {
158     R x=0,f=1;
159     char c=getchar();
160     while (!isdigit(c)) { if(c=='-') f=-f; c=getchar(); }
161     while (isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
162     return x*f;
163 }
Day1

---shzr

posted @ 2019-02-28 20:59  shzr  阅读(186)  评论(0)    收藏  举报