此题卡常能过
查看原帖
此题卡常能过
1237680
yedalong楼主2024/10/25 11:50

原先代码是这样:

#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';
		}
	}
}
2024/10/25 11:50
加载中...