普及- 难度。。。
数论推一下即可。。。
代码:
#include<bits/stdc++.h> using namespace std; int main(){ //freopen("candy.in","r",stdin); //freopen("candy.out","w",stdout); int n,l,r; scanf("%d%d%d",&n,&l,&r); int v=l%n; if(r-l+v<n) printf("%d",r-l+v); else printf("%d",n-1); return 0; }
思路:先记录每个数据的排名,因为调换的次数较少,所以在一操作中进行重排名。将处在原、现数字中的排名加或减1,在处理相同数字的情况。(可惜我没能写出找a[x]的排名的方法,只能写排序了)
小数据能过,大数据会超时。。。
#include<bits/stdc++.h> using namespace std; struct num{ int s; int k; int p; }; bool f1(num x,num y){ if(x.s<y.s) return 1; else return 0; } bool f2(num x,num y){ if(x.k<y.k) return 1; else return 0; } int main(){ //freopen("sort.in","r",stdin); //freopen("sort.out","w",stdout); int n,q; scanf("%d%d",&n,&q); num a[n+1]; for(int i=1;i<=n;i++){ scanf("%d",&a[i].s); a[i].k=i; } sort(a+1,a+1+n,f1); for(int i=1;i<=n;i++){ a[i].p=i; } sort(a+1,a+n+1,f2); for(int i=1;i<=q;i++){ int d; scanf("%d",&d); if(d==1){ int x,v; scanf("%d%d",&x,&v); a[x].s=v; } else{ int x; sort(a+1,a+1+n,f1); for(int i=1;i<=n;i++){ a[i].p=i; } sort(a+1,a+n+1,f2); scanf("%d",&x); printf("%d\n",a[x].p); } } return 0; }
时间来不及了,写的骗分,估摸着二十个数据点能过八个。。。
#include<bits/stdc++.h> using namespace std; int cs[1000000]; int main(){ //freopen("network.in","r",stdin); //freopen("network.out","w",stdout); memset(cs,0,sizeof(cs)); int n; cin>>n; for(int i=1;i<=n;i++){ char g[20]; scanf("%s",g); int a,b,c,d,e; scanf("%d.%d.%d.%d:%d",&a,&b,&c,&d,&e); if(g[0]=='S'){ cs[a+b*2-c+231*d+e*4]=i; cout<<"OK"<<endl; } else{ if(cs[a+b*2-c+231*d+e*4]!=0){ cout<<cs[a+b*2-c+231*d+e*4]<<endl; } else cout<<"FAIL"<<endl; } } return 0; }
后来想的思路就是a,b,c,d,e都用字符串转数字来判断域名错误的情况。
用数组记录每个水果的存在情况,模拟。
#include<bits/stdc++.h> using namespace std; int main(){ //freopen("fruit.in","r",stdin); //freopen("fruit.out","w",stdout); int n; scanf("%d",&n); int a[n+1]; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } int t=0; bool f[n+1]; memset(f,0,sizeof(f)); while(t<n){ int u=-1; for(int i=1;i<=n;i++){ if(u!=a[i]&&f[i]==0){ printf("%d ",i); u=a[i]; a[i]=-1; f[i]=1; t++; } } printf("\n"); } return 0; }