社区讨论
悬棺求条:
P1110[ZJOI2007] 报表统计参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m4mh5me7
- 此快照首次捕获于
- 2024/12/13 16:16 去年
- 此快照最后确认于
- 2025/11/04 12:56 4 个月前
rt.
双 FHQ-treap WA 14pts,只 A 了 #2
CPP#include <bits/stdc++.h>
using namespace std;
mt19937 ra(114514);
long long Rand() {return ra() % 0x3f3f3f3f;}
const long long N = 1000005;
long long n , m , a[N] , nxt[N] , pre[N];
char s[30];
struct treap
{
long long rt , smin;
struct node {long long ls , rs , siz , val , key;} p[N]; long long tot = 0;
void update(long long now) {p[now].siz = p[p[now].ls].siz + p[p[now].rs].siz + 1;}
long long add(long long num) {p[++tot].ls = p[tot].rs = 0; p[tot].val = num; p[tot].key = Rand(); p[tot].siz = 1; return tot;}
long long Max(long long now) {while(p[now].rs) now = p[now].rs; return p[now].val;}
long long Min(long long now) {while(p[now].ls) now = p[now].ls; return p[now].val;}
void split(long long now , long long num , long long &x , long long &y)
{
if(!now) {x = y = 0; return;}
if(p[now].val <= num) x = now , split(p[now].rs , num , p[now].rs , y);
else y = now , split(p[now].ls , num , x , p[now].ls);
update(now);
}
long long merge(long long x , long long y)
{
if(!x || !y) return x + y;
if(p[x].key > p[y].key) {p[x].rs = merge(p[x].rs , y) , update(x); return x;}
else {p[y].ls = merge(x , p[y].ls) , update(y); return y;}
}
void insert(long long num)
{
long long x , y;
split(rt , num , x , y);
if(p[x].siz) smin = min(smin , abs(num - Max(x)));
if(p[y].siz) smin = min(smin , abs(Min(y) - num));
rt = merge(merge(x , add(num)) , y);
}
void del(long long num)
{
long long x , y , z;
split(rt , num , x , z);
split(x , num - 1 , x , y);
y = merge(p[y].ls , p[y].rs);
rt = merge(merge(x , y) , z);
}
} t1 , t2;
int main()
{
cin.tie(nullptr)->sync_with_stdio(false);
cin >> n >> m;
t1.smin = 0x3f3f3f3f;
for(long long i = 1 ; i <= n ; i++) cin >> a[i] , t1.insert(a[i]);
for(long long i = 1 ; i < n ; i++) t2.insert(abs(a[i + 1] - a[i])) , nxt[i] = i + 1 , pre[i + 1] = i; pre[n + 1] = n;
long long cnt = n;
for(long long i = 1 , j , k ; i <= m ; i++)
{
cin >> (s + 1);
if(s[1] == 'I')
{
cin >> j >> k;
if(j < n) t2.del(abs(a[j + 1] - a[pre[j + 1]]));
t2.insert(abs(a[pre[j + 1]] - k));
if(j < n) t2.insert(abs(k - a[j + 1]));
a[++cnt] = k;
pre[cnt] = pre[j + 1];
nxt[cnt] = j + 1;
nxt[pre[j + 1]] = cnt;
pre[j + 1] = cnt;
t1.insert(k);
}
else if(s[5] == 'G') cout << t2.Min(t2.rt) << '\n';
else cout << t1.smin << '\n';
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...