求助
查看原帖
求助
556362
Unnamed114514楼主2021/10/23 22:15

算法和思路是对的,应该是错了一个小细节,52WA

#include<bits/stdc++.h>
using namespace std;
int a[8005],q,n,ans[8005];
struct node{
	int x,id;
	bool operator <(const node &t) const{
		return x==t.x?id<t.id:x<t.x;
	}
}f[8005];
int find(int k,int l,int r){
	int mid=(l+r)>>1;
	if(f[mid].x==k)
		return mid;
	else if(f[mid].x<k)
		return find(k,mid+1,r);
	else
		return find(k,l,mid-1);
}
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]),f[i]=node({a[i],i});
	stable_sort(f+1,f+n+1);
	for(int i=1;i<=n;i++)
		ans[f[i].id]=i;
	for(int i=1;i<=q;i++){
		int opt,x,y;
		scanf("%d%d",&opt,&x);
		if(opt==2)
			printf("%d\n",ans[x]);
		else{
			scanf("%d",&y);
			int u=a[x];
			if(y!=u){
				int k=find(a[x],1,n);
				a[x]=f[k].x=y;
				if(u<y){
					for(int j=k+1;j<=n;j++){
						if(f[j]<f[j-1])
							swap(f[j],f[j-1]),swap(ans[f[j].id],ans[f[j-1].id]);
						else
							break;
					}
				} else{
					for(int j=k-1;j>=1;j--)
						if(f[j+1]<f[j])
							swap(f[j],f[j+1]),swap(ans[f[j].id],ans[f[j+1].id]);
						else
							break;
				}
			}
		}
	}
	return 0;
}
2021/10/23 22:15
加载中...