原先代码是这样:
#include <bits/stdc++.h>
using namespace std;
struct node{
int num,id;
}a[8005];
bool cmp(node a,node b){
if(a.num==b.num) return a.id<b.id;
return a.num<b.num;
}
int n,q,ans[8005],opt,x,v;//ans[i]表示原数组中第i个元素排序后在新数组中的位置
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>q;
for(int i = 1;i<=n;i++) cin>>a[i].num,a[i].id=i;
sort(a+1,a+1+n,cmp);
for(int i = 1;i<=n;i++) ans[a[i].id]=i;
while(q--){
cin>>opt>>x;
if(opt==1){
cin>>v;
for(int i = 1;i<=n;i++) if(a[i].id==x) a[i].num=v;
sort(a+1,a+1+n,cmp);
for(int i = 1;i<=n;i++) ans[a[i].id]=i;
}
else{
cout<<ans[x]<<'\n';
}
}
}
暴力,会TLE
将sort改成stable_sort后
即可通过
原理:stable_sort可以较快速处理大部分有序的数组的排序
#include <bits/stdc++.h>
using namespace std;
struct node{
int num,id;
}a[8005];
inline bool cmp(node a,node b){
if(a.num==b.num) return a.id<b.id;
return a.num<b.num;
}
int n,q,ans[8005],opt,x,v;//ans[i]表示原数组中第i个元素排序后在新数组中的位置
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>q;
for(int i = 1;i<=n;i++) cin>>a[i].num,a[i].id=i;
sort(a+1,a+1+n,cmp);
for(int i = 1;i<=n;i++) ans[a[i].id]=i;
while(q--){
cin>>opt>>x;
if(opt==1){
cin>>v;
for(int i = 1;i<=n;i++) if(a[i].id==x) a[i].num=v;
stable_sort(a+1,a+1+n,cmp);
for(int i = 1;i<=n;i++) ans[a[i].id]=i;
}
else{
cout<<ans[x]<<'\n';
}
}
}