维修数列
维修数列
快要省选了!应该做一点数据结构题练练码力,但是又不想一直码码码,所以就有了这个奇怪的"七天写完维修数列"。
维修数列有六个操作,一天写一个,万一出现了什么意外情况,七天应该也是可以写完的吧...
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 }
---shzr

浙公网安备 33010602011771号