题解
每次操作都会是排序后的元素差值减一,所以答案为初始序列最大值加上最大差值
用STL的multiset维护差值和序列值
code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[200005];
void solve()
{
int n;
cin>>n;
multiset<ll> st;
multiset<ll> deta;
for(int i=1;i<=n;i++)
{
cin>>a[i];
st.insert(a[i]);
}
for(auto it=next(st.begin());it!=st.end();it=next(it)) deta.insert(*it-*prev(it));
int q;
cin>>q;
while(q--)
{
int x,v;
cin>>x>>v;
auto it=st.find(a[x]);
if(it==st.begin()) deta.erase(deta.find(*next(it)-*it));
else if(next(it)==st.end()) deta.erase(deta.find(*it-*prev(it)));
else
{
auto nxt=next(it),prv=prev(it);
deta.erase(deta.find(*nxt-*it));
deta.erase(deta.find(*it-*prv));
deta.insert(*nxt-*prv);
}
st.erase(it);
a[x]=v;
st.insert(v);
it=st.find(v);
if(it==st.begin()) deta.insert(*next(it)-*it);
else if(next(it)==st.end()) deta.insert(*it-*prev(it));
else
{
auto nxt=next(it),prv=prev(it);
deta.insert(*nxt-*it);
deta.insert(*it-*prv);
deta.erase(deta.find(*nxt-*prv));
}
cout<<*deta.rbegin()+*st.rbegin()<<' ';
}
cout<<'\n';
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--) solve();
return 0;
}
标签:Equalizer,Great,insert,deta,next,erase,st,find
From: https://www.cnblogs.com/pure4knowledge/p/18294419