数据还是不够啊,按理来说我这应该超时的,居然水过去了
查看原帖
数据还是不够啊,按理来说我这应该超时的,居然水过去了
288782
痴人说梦wza楼主2024/1/17 10:10
#include<iostream>
using namespace std;
const int N=1000005;
int a[N],n,q,to[N],an=0,a1=0x3f3f3f3f;
int next(int x){
	for(int i=x;i>=1;i--)
		if(to[i]!=0)
			return i;
}
int last(int x){
	for(int i=x;i<N;i++)
		if(to[i]!=0)
			return i;
}
int main(){
	cin>>n>>q;
   //原理可以参考题解,想要答案最小就是使他小到大排序,最后结果就是 2*(an-a1) ,也就是说只要维护an 和 a1 就好了。
	for(int i=1;i<=n;i++){
		cin>>a[i];
		an=max(an,a[i]);
		a1=min(a1,a[i]);
		to[a[i]]++;
	}
	while(q--){
		int opt,x;
		cin>>opt>>x;
		if(opt==1){
			if(to[x]==0) {
				cout<<-1<<endl;
				continue;
			}
			to[x]--;
			if(x==an && to[x]==0) an=next(an);
			if(x==a1 && to[x]==0) a1=last(a1);
			cout<<2*(an-a1)<<endl;
		}else if(opt==2){
			to[x]++;
			if(x>an) an=x;
			if(x<a1) a1=x;
			cout<<2*(an-a1)<<endl;
		}
	}
	return 0;
} 
2024/1/17 10:10
加载中...