FHQ Treap 56pts求调
查看原帖
FHQ Treap 56pts求调
1106260
muqi132楼主2024/7/13 10:10

代码如下

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+7;
const int inf=1e9;

int n,m,in,last;
int MIN_SORT_GAP=inf;
vector<int> a[N];
priority_queue<int,vector<int>, greater<int> > exsit,del;
struct FHQTree{
    struct Node{int val,ls,rs,pri,siz;}t[N<<1];
    int cnt=0,root=0;
    int newNode(int val){
        t[++cnt].siz=1;t[cnt].ls=t[cnt].rs=0;
        t[cnt].pri=rand();t[cnt].val=val;
        return cnt;
    }
    void Up(int id){t[id].siz=t[t[id].ls].siz+t[t[id].rs].siz+1;}
    void Split(int id, int val, int &L, int &R){ // 排名分裂,L最终应含有k个元素
        if(!id){L=R=0;return;}
        if(t[id].val<=val){L=id;Split(t[id].rs,val,t[id].rs,R);}
        else{R=id;Split(t[id].ls,val,L,t[id].ls);}
        Up(id);
    }
    int Merge(int L, int R){
        if(!L&&!R) return L+R;
        if(t[L].pri>t[R].pri){t[L].rs=Merge(t[L].rs,R);Up(L);return L;}
        else{t[R].ls=Merge(L,t[R].ls);Up(R);return R;}
    }
    int Val(int id,int k){
        if(!k) return 0;
        if(k==t[t[id].ls].siz+1) return t[id].val;
        else if(k>t[t[id].ls].siz+1) return Val(t[id].rs,k-(t[t[id].ls].siz+1));
        else if(k<=t[t[id].ls].siz) return Val(t[id].ls,k);
    }
    void Insert(int val,bool flag=1){
        int L,R;Split(root,val,L,R);
        if(flag) MIN_SORT_GAP=min(MIN_SORT_GAP,min(val-Val(L,t[L].siz),Val(R,1)-val));
        root=Merge(Merge(L,newNode(val)),R);
    }
    void Out(int id){ // 中序遍历,打印结果
        if(!id) return;
        Out(t[id].ls);printf("%d ",t[id].val);Out(t[id].rs);
    }
}T;

int main(){
    freopen("P1110_5.in", "r", stdin);
    scanf("%d%d",&n,&m);
    T.Insert(0,0);T.Insert(inf,0);
    for(int i=1; i<=n; i++){
        scanf("%d", &in);cout<<i<<endl;
        a[i].push_back(in);
        if(i!=1) exsit.push(abs(in-last));last=in;
        T.Insert(in);
    }
    for(int i=1,rk,val; i<=m; i++){
        char opt[N];scanf("%s",opt);
        if(opt[0]=='I'){
            scanf("%d%d",&rk,&val);
            if(MIN_SORT_GAP) T.Insert(val);
            if(rk!=n){del.push(abs(a[rk+1].front()-a[rk].back()));exsit.push(abs(a[rk+1].front()-val));}
            exsit.push(abs(val-a[rk].back()));a[rk].push_back(val);
            while(exsit.top()==del.top()&&(!exsit.empty())&&(!del.empty())){exsit.pop(),del.pop();}
        }
        if(opt[4]=='G') printf("%d\n",exsit.top());
        if(opt[4]=='S') printf("%d\n",MIN_SORT_GAP);
    }
    return 0;
}

下载了#5测试点数据但是本地跑不动,读入第25198个元素会卡住(不清楚为什么每次都能精确的卡在第25198个元素)

2024/7/13 10:10
加载中...