UVA 12299 - RMQ with Shifts 线段树
线段树。。。。
值得一提的是作者处理括号内的方法,我还傻傻的用sscanf哭T T
可以直接这样的。。。。。速度快还简单
inline void action_position() { len=0; pos[0]=0; int L=strlen(action); for(int i=6;i<L;i++) { if(isdigit(action[i])) pos[len]=pos[len]*10+ action[i]- 48; else pos[++len]=0; } }
上代码,sscanf的
#include <cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN=500000+10; const int INF=1000000000; int a[MAXN],pos[100],start[100],ql,qr,p,v,len; char action[100]; void action_position() { len=0; for(int i=6;action[i]!=')';) if(action[i]!=',') { sscanf(action+i,"%d",&pos[len++]); i=strchr(action+i,',')-action+1; if(i<=0) break; } } struct IntervalTree { int data[MAXN],n; void build(int cur,int L,int R) { if(L==R) data[cur]=a[L]; else { int M=L+(R-L)/2; build(cur*2,L,M); //left build(cur*2+1,M+1,R); //right data[cur]=min(data[cur*2],data[cur*2+1]); } } int query(int cur,int L,int R) { int M=L+(R-L)/2,ans=INF; if(ql<=L&&R<=qr) return data[cur]; if(ql<=M) ans= min(ans,query(cur*2,L,M)); //left if(qr>M) ans=min(ans,query(cur*2+1,M+1,R)); //right return ans; } void update(int cur,int L,int R) { int M=L+(R-L)/2; if(L==R) data[cur]=v; else { if(p<=M) update(cur*2,L,M); else update(cur*2+1,M+1,R); data[cur]=min( data[cur *2 ],data[cur*2+1]); } } }; IntervalTree tree; int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); tree.build(1,1,n); for(int ri=0;ri<m;ri++) { scanf("%s",action); action_position(); if(action[0]=='q') { ql=pos[0]; qr=pos[1]; printf("%d\n",tree.query(1,1,n)); } else { int temp=a[ pos[len-1] ]; for(int i=0;i<len;i++) start[i]=a[ pos[i] ]; start[len]=start[0]; for(int i=0;i<len;i++) { p = pos[i]; v =a[ p ]= start[i+1]; tree.update(1, 1, n); } } } } return 0; }
改进了处理数据(读取括号里面的数)
#include <cstdio> #include<cstring> #include<algorithm> #include<cctype> using namespace std; const int MAXN=500000+10; const int INF=1000000000; int a[MAXN],pos[100],start[100],ql,qr,p,v,len; char action[100]; inline void action_position() { len=0; pos[0]=0; int L=strlen(action); for(int i=6;i<L;i++) { if(isdigit(action[i])) pos[len]=pos[len]*10+ action[i]- 48; else pos[++len]=0; } } struct IntervalTree { int data[MAXN],n; void build(int cur,int L,int R) { if(L==R) data[cur]=a[L]; else { int M=L+(R-L)/2; build(cur*2,L,M); //left build(cur*2+1,M+1,R); //right data[cur]=min(data[cur*2],data[cur*2+1]); } } int query(int cur,int L,int R) { int M=L+(R-L)/2,ans=INF; if(ql<=L&&R<=qr) return data[cur]; if(ql<=M) ans= min(ans,query(cur*2,L,M)); //left if(qr>M) ans=min(ans,query(cur*2+1,M+1,R)); //right return ans; } void update(int cur,int L,int R) { int M=L+(R-L)/2; if(L==R) data[cur]=v; else { if(p<=M) update(cur*2,L,M); else update(cur*2+1,M+1,R); data[cur]=min( data[cur *2 ],data[cur*2+1]); } } }; IntervalTree tree; int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); tree.build(1,1,n); for(int ri=0;ri<m;ri++) { scanf("%s",action); action_position(); if(action[0]=='q') { ql=pos[0]; qr=pos[1]; printf("%d\n",tree.query(1,1,n)); } else { int temp=a[ pos[len-1] ]; for(int i=0;i<len;i++) start[i]=a[ pos[i] ]; start[len]=start[0]; for(int i=0;i<len;i++) { p = pos[i]; v =a[ p ]= start[i+1]; tree.update(1, 1, n); } } } } return 0; }
新 blog : www.hrwhisper.me