线段树。。。。
值得一提的是作者处理括号内的方法,我还傻傻的用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;
}