社区讨论

悬棺求条:

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 条回复,欢迎继续交流。

正在加载回复...