玄3关求卡常
  • 板块学术版
  • 楼主Misty_Post
  • 当前回复4
  • 已保存回复4
  • 发布时间2025/7/28 14:53
  • 上次更新2025/7/28 17:41:03
查看原帖
玄3关求卡常
755789
Misty_Post楼主2025/7/28 14:53

RT,实在卡不动了,码风极其丑,勿喷。

感激不尽。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,t,a[1000000],x,y,q,res[1000000],rep[1000000];
map<ll,ll>M;
map<ll,ll>ans;
set<ll>s,ss;
priority_queue<ll>Q,QQ;
void solve(){
	M.clear();
	ans.clear();
	s.clear();
	ss.clear();
	Q=priority_queue<ll>();
	QQ=priority_queue<ll>();
	for(int i=1;i<=n;i++){
		res[i]=a[i];
	}
	sort(a+1,a+n+1);
	for(int i=2;i<=n;i++){
		if(ans[a[i]-a[i-1]]==0){
			Q.push(a[i]-a[i-1]);
		}
		ans[a[i]-a[i-1]]++;//答案方案数 
	}
	for(int i=1;i<=n;i++){
		a[i]=res[i];
	}
	for(int i=1;i<=n;i++){
		M[a[i]]++;
		if(M[a[i]]==1){
			s.insert(a[i]);
			ss.insert(-a[i]);
		}
	}
	for(int i=1;i<=n;i++){
		QQ.push(a[i]);
		a[i]=res[i];
	}
	while(q--){
		ll x,y;
		cin>>x>>y;
		M[a[x]]--;
		if(M[a[x]]==0){//没有了,合并! 删除小块答案,增加大块答案 
			ll hou=*(s.upper_bound(a[x]));
			ll qian=-(*(ss.upper_bound(-a[x])));
			if(ss.upper_bound(-a[x])!=ss.end()){//前面有数 
				ans[abs(a[x]-qian)]--; 
			}
			if(s.upper_bound(a[x])!=s.end()){//后面有数 
				ans[abs(hou-a[x])]--; 
			}
			if(s.upper_bound(a[x])!=s.end()&&ss.upper_bound(-a[x])!=ss.end()){//都有,可以合并  
				if(ans[abs(hou-qian)]==0){
					Q.push(abs(hou-qian));
				}
				ans[abs(hou-qian)]++;
			}
			s.erase(a[x]);
			ss.erase(-a[x]);
		}
		M[y]++;
		if(M[y]==1){//无中生有,可以分割 
			QQ.push(y);
			ll hou=*(s.upper_bound(y));
			ll qian=-(*(ss.upper_bound(-y)));
			if(ss.upper_bound(-y)!=ss.end()){//前面有数 
				if(ans[abs(y-qian)]==0){
					Q.push(abs(y-qian));
				}
				ans[abs(y-qian)]++; 
			}
			if(s.upper_bound(y)!=s.end()){//后面有数 
				if(ans[abs(hou-y)]==0){
					Q.push(abs(hou-y));
				}
				ans[abs(hou-y)]++; 
			}
			if(s.upper_bound(y)!=s.end()&&ss.upper_bound(-y)!=ss.end()){//都有,分割掉 
				ans[abs(hou-qian)]--;
			}
			s.insert(y);
			ss.insert(-y);
		}
		a[x]=y;
		while(1){
			if(ans[Q.top()]){
				while(1){
					if(M[QQ.top()]){
						cout<<Q.top()+QQ.top()<<"\n";
						break;
					}
					else{
						QQ.pop();
					}
				}
				break;
			}
			else{
				Q.pop();
			}
		}
	}
}
int main(){
	cin>>t;
	while(t--){
		scanf("%lld",&n);
		for(int i=1;i<=n;i++){
			scanf("%lld",&a[i]);
		}
		scanf("%lld",&q);
		solve();
	}
} 
/*
2
4
2 4 6 8
3
1 5
3 10
4 1

5
1 4 9 11 6
5
1 5
3 6
5 2
2 10
3 7
*/
2025/7/28 14:53
加载中...