标签:style blog http color os art
uva12299:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3720
题意:给你n个数,然后有两个操做,shift<a1,a2,a3.....ak>从左到右一次交换,即a1和a2交换,完了之后,a2和a3交换,以此类推。query<a1,a2>,查询a1到a2区间之间的最小值。
题解:一开始没有看懂题目,看错了,看懂之后,才发现是个水题,线段树区间查询,单点更新。不过读入要小心处理一下。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 const int N=100002; 7 int n,q,a[N]; 8 char str[10]; 9 int t1,t2; 10 struct SegTree{ 11 int l,r; 12 int minn; 13 inline int mid(){ 14 return (l+r)/2; 15 } 16 }num[N*4]; 17 void pushup(int rt){ 18 num[rt].minn=min(num[rt<<1].minn,num[rt<<1|1].minn); 19 } 20 void build(int rt,int l,int r){ 21 num[rt].l=l; 22 num[rt].r=r; 23 if(l==r){ 24 num[rt].minn=a[l]; 25 return; 26 } 27 int mid=num[rt].mid(); 28 build(rt<<1,l,mid); 29 build(rt<<1|1,mid+1,r); 30 pushup(rt); 31 } 32 void update(int pos,int rt,int val){ 33 if(num[rt].l==num[rt].r){ 34 num[rt].minn=val; 35 return; 36 } 37 int mid=num[rt].mid(); 38 if(mid>=pos)update(pos,rt<<1,val); 39 else 40 update(pos,rt<<1|1,val); 41 pushup(rt); 42 } 43 int query(int rt,int l,int r){ 44 if(num[rt].l==l&&num[rt].r==r){ 45 return num[rt].minn; 46 } 47 int mid=num[rt].mid(); 48 if(mid>=r)return query(rt<<1,l,r); 49 else if(mid<l)return query(rt<<1|1,l,r); 50 else return min(query(rt<<1,l,mid),query(rt<<1|1,mid+1,r)); 51 } 52 int main(){ 53 scanf("%d%d",&n,&q); 54 for(int i=1;i<=n;i++){ 55 scanf("%d",&a[i]); 56 } 57 build(1,1,n); 58 for(int i=1;i<=q;i++){ 59 scanf("%6s",str);//¶ÁÈ¡6¸ö×Ö·û 60 if(str[0]==‘q‘){ 61 scanf("%d,%d)",&t1,&t2); 62 printf("%d\n",query(1,t1,t2)); 63 } 64 else{ 65 char c; 66 int cnt=0; 67 while (scanf("%d%c",&t2,&c)){ 68 cnt++; 69 if(cnt==1){ 70 t1=t2; 71 continue; 72 } 73 int temp=a[t1]; 74 a[t1]=a[t2]; 75 a[t2]=temp; 76 update(t1,1,a[t1]); 77 update(t2,1,a[t2]); 78 t1=t2; 79 if (c!=‘,‘) break; 80 } 81 } 82 } 83 }
RMQ with Shifts,布布扣,bubuko.com
标签:style blog http color os art
原文地址:http://www.cnblogs.com/chujian123/p/3840717.html