FHQ Treap 样例不过求调。
查看原帖
FHQ Treap 样例不过求调。
1296826
lcfollower楼主2024/6/3 21:46

rt。

#include<bits/stdc++.h>
#define int long long
#define _Dark_Star exit(0)
#define inf 0x3f3f3f3f
#define up(i,x,y) for(register int i=x;i<=y;i++)
#define dn(i,x,y) for(register int i=x;i>=y;i--)
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return x*f;}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10|48);}
inline void writeln(int x){write(x),putchar('\n');}
inline void writesp(int x){write(x),putchar(' ');}

const int N = 1e5 + 10;
int leave , delta;
int minn;

struct node{
  int val , key , size , l , r;
}tr[N];
int n , root , idx;
int T;

inline int newnode(int v){
  return tr[++idx].val = v , tr[idx].key = rand() , tr[idx].size = 1 , idx;
} inline void pushup(int u){
  tr[u].size = tr[tr[u].l].size + tr[tr[u].r].size + 1;
} inline void split(int u ,int v,int &x,int &y){
  if(!u){x = y = 0;return;}
  if(tr[u].val <= v){
    x = u;
    split(tr[x].r , v , tr[x].r , y);
  }
  else{
    y = u;
    split(tr[y].l , v , x , tr[y].l);
  }
  pushup(u);
} inline int merge(int x,int y){
  if(!x || !y) return x + y;
  if(tr[x].key < tr[y].key){
    tr[x].r = merge(tr[x].r , y);
    pushup(x);
    return x;
  }
  else{
    tr[y].l = merge(x , tr[y].l);
    pushup(y);
    return y;
  }
} inline int get_k(int u,int k){//返回排名为 k 的节点。
  if(k <= tr[tr[u].l].size) return get_k(tr[u].l , k);
  if(k == tr[tr[u].l].size + 1) return u;
  return get_k(tr[u].r , k - tr[tr[u].l].size - 1);
} inline int get_val(int x){
  int p = get_k(root , x);
  return tr[p].val;
} signed main(){
  srand(99);
  T = read();minn = read();
  int x , y , z;
  while(T--){
    char op;int t = read();
    cin>>op;
    if(op == 'I'){
      if(t >= minn){
        t -= delta;
        split(root,t,x,y);
        root = merge(x,merge(newnode(t),y));
      }
    }
    else if(op == 'A') delta += t;
    else if(op == 'S'){
      delta -= t;
      split(root , minn - delta - 1 , x, y);
      root = y;
      leave += tr[x].size;
    }
    else if(op == 'F'){
      if(tr[root].size < t) puts("-1");
      else writeln(delta + tr[get_k(root ,tr[root].size - t + 1)].val);
    }
  }
  writeln(leave);
  _Dark_Star;
}
2024/6/3 21:46
加载中...