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的博客,未经允许,请勿转载,谢谢。

posted @ 2017-07-07 23:15  PaperCloud  阅读(235)  评论(0编辑  收藏  举报