比赛 |
2025.4.12 |
评测结果 |
AAAAAAAAAAAAAAA |
题目名称 |
Election Queries |
最终得分 |
100 |
用户昵称 |
flyfree |
运行时间 |
7.080 s |
代码语言 |
C++ |
内存使用 |
19.78 MiB |
提交时间 |
2025-04-12 11:52:35 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pir pair<ll,ll>
#define ls first
#define rs second
#define mp make_pair
#define mod
#define MAXN 200010
#define len 550
#define qmod(x) (x>mod?x-mod:x)
#define V 200000
#define debug cout << "flyfreemrn\n";
inline ll read(){
ll x = 0,f = 1;
char c = getchar();
while(c < '0'||c > '9'){
if(c == '-')f = -1;
c = getchar();
}
while(c >= '0'&&c <= '9'){
x = x*10+c-'0';
c = getchar();
}
return x*f;
}
ll n,q,maxz;
ll cnt[MAXN];
vector <ll> vec;
set <ll> st[MAXN];
ll suf_min[MAXN],suf_max[MAXN];
ll a[MAXN];
ll pos[MAXN],to[MAXN];
void update(ll pos){
suf_max[pos] = suf_max[pos + 1];
suf_min[pos] = suf_min[pos + 1];
if(st[pos].end() == st[pos].begin())return;
suf_max[pos] = max(suf_max[pos + 1], *(-- st[pos].end()));
suf_min[pos] = min(suf_min[pos + 1], *(st[pos].begin()));
}
void insert(ll val){
st[cnt[val]].erase(val);
if(maxz == cnt[val])maxz = cnt[val] + 1;
++ cnt[val];
st[cnt[val]].insert(val);
update(cnt[val]);
update(cnt[val] - 1);
}
void del(ll val){
st[cnt[val]].erase(val);
if(maxz == cnt[val] && st[cnt[val]].begin() == st[cnt[val]].end())maxz = cnt[val] - 1;
-- cnt[val];
st[cnt[val]].insert(val);
update(cnt[val] + 1);
update(cnt[val]);
}
int main(){
freopen("Queries.in", "r", stdin);
freopen("Queries.out", "w", stdout);
n = read(),q = read();
for(int i = 1;i <= n; ++i){
a[i] = read();
++ cnt[a[i]];
}
for(int i = 1;i <= q; ++i){
pos[i] = read(),to[i] = read();
++ cnt[to[i]];
}
for(int i = 1;i <= n; ++i){
if(cnt[i] >= len)vec.push_back(i);
cnt[i] = 0;
}
for(int i = 1;i <= n; ++i){
++ cnt[a[i]];
}
for(int i = 1;i <= n; ++i){
maxz = max(maxz, cnt[a[i]]);
st[cnt[a[i]]].insert(a[i]);
}
suf_min[V + 1] = 1e18;
suf_max[V + 1] = 0;
for(int i = V;i; --i){
update(i);
}
for(int i = 1;i <= q; ++i){
del(a[pos[i]]);
insert(to[i]);
a[pos[i]] = to[i];
ll ans = 0;
// debug;
for(int j = 0;j < vec.size(); ++j){
ll qs_min = suf_min[max(maxz - cnt[vec[j]], 1ll)];
ll qs_max = suf_max[max(maxz - cnt[vec[j]], 1ll)];
ans = max(ans, abs(vec[j] - qs_min));
ans = max(ans, abs(vec[j] - qs_max));
}
for(int j = 1;j < len; ++j){
// cout << j << endl;
if(st[j].begin() == st[j].end())continue;
ll now_min = *st[j].begin();
ll now_max = *(-- st[j].end());
ll qs_min = suf_min[max(maxz - j, 1ll)];
ll qs_max = suf_max[max(maxz - j, 1ll)];
ans = max(ans, abs(now_max - qs_min));
ans = max(ans, abs(now_min - qs_max));
}
cout << ans << endl;
}
return 0;
}