UVA 12299 RMQ with shifts
就是线段树的单点修改和区间查询。
然而输入打了一个小时才弄清楚。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define MN 100000 6 #define R return 7 #define INF 0x3f3f3f3f 8 char ch; 9 inline int read(){ 10 int x = 0; ch=getchar(); 11 while(ch < '0'||ch > '9') ch=getchar(); 12 while(ch >='0'&&ch <='9') x = x*10 + ch - '0',ch = getchar(); 13 R x ; 14 } 15 int tree[MN*4+20]; 16 int n,q,a[MN+10],cha[35],cnt,l,r; 17 void init(int t,int a,int b,int l,int add){ 18 int m=a+(b-a)/2; 19 if(a==b){tree[t]=add;R;} 20 if(m>=l) init(t<<1,a,m,l,add); 21 if(m<l) init(t<<1|1,m+1,b,l,add); 22 tree[t]=min(tree[t<<1],tree[t<<1|1]); 23 } 24 int query(int t,int a,int b,int l,int r){ 25 if(l<=a&&b<=r) R tree[t]; 26 int m=(a+b)/2,ans=INF; 27 if(l<=m) ans=min(ans,query(t<<1,a,m,l,r)); 28 if(m<r) ans=min(ans,query(t<<1|1,m+1,b,l,r)); 29 R ans; 30 } 31 void evlos(bool k){ 32 if(k){ 33 l=read();r=read(); 34 printf("%d\n",query(1,1,n,l,r)); 35 } 36 if(!k){ 37 cnt=0; cha[++cnt]=read(); 38 while(ch==',') cha[++cnt]=read(); 39 cha[++cnt]=cha[1]; 40 for(int i=1;i<cnt;i++) init(1,1,n,cha[i],a[cha[i+1]]); 41 int v=a[cha[1]]; 42 for(int i=1;i+1<cnt;i++) a[cha[i]]=a[cha[i+1]]; 43 a[cha[cnt-1]]=v; 44 } 45 } 46 void solve(){ 47 bool k; 48 ch=getchar(); 49 while(ch!='q'&&ch!='s') ch=getchar(); 50 if(ch=='q') k=1; 51 if(ch=='s') k=0; 52 while(ch!='(') ch=getchar(); 53 evlos(k); 54 } 55 int main(){ 56 n=read();q=read(); 57 for(int i=1;i<=n;i++) a[i]=read(),init(1,1,n,i,a[i]); 58 while(q--) solve(); 59 R 0; 60 }
——————————————————————————————————————————————————————————
来自Paper Cloud的博客,未经允许,请勿转载,谢谢。
致虚极,守静笃,万物并作,吾以观其复