救命
查看原帖
救命
379071
jjAAjj楼主2021/6/17 20:23

FHQtreap\texttt{FHQtreap} 错的离谱

image.png

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<queue>
//#include<map>
#include<vector>
#include<math.h>
using namespace std;
#define int long long
#define forr(i,a,b) for(int i=a;i<=b;i++)
#define repp(i,a,b) for(int i=a;i>=b;i--)
#define INF 1e9
#define ll long long
#define MAXN 200005
const int _x[]={0,1,0,-1,0},_y[]={0,0,1,0,-1};
#define mem(a,n) memset(a,n,sizeof(a));
#define chkmax(a,b) a=a>b?a:b;
#define chkmin(a,b) a=a<b?a:b;
#include<set>
#include<stack>
#define lc tree[i].l
#define rc tree[i].r
#define MOD 1000000
int root,cnt;
struct FHQtree{
	int l,r;
	int size,key;
	int val;
}tree[MAXN*4];
void update(int i){
	tree[i].size=tree[lc].size+tree[rc].size+1;
}
int add(int i){
	tree[++cnt].val=i;
	tree[cnt].key=rand();
	tree[cnt].size=1;
	return cnt;
}
void split(int i,int k,int &l,int &r){
	if(!i){
		l=r=0;
		return;
	}
	if(tree[i].val<=k){
		l=i;
		split(rc,k,rc,r);
	}
	else{
		r=i;
		split(lc,k,l,lc);
	}
	update(i);
}
int merge(int l,int r){
	if(!l||!r){
		return l+r;
	}
	if(tree[l].key<=tree[r].key){
		tree[l].r=merge(tree[l].r,r);
		update(l);
		return l;
	}
	else if(tree[l].key>tree[r].key){
		tree[r].l=merge(l,tree[r].l);
		update(r);
		return r;
	}
}
int l,r,p;
void insert(int i){
	split(root,i,l,r);
	root=merge(merge(l,add(i)),r);
}
void pop(int i){
	split(root,i,l,p);
	split(l,i-1,l,r);
	r=merge(tree[r].l,tree[r].r);
	root=merge(merge(l,r),p);
}
int findrk(int x){
	split(root,x-1,l,r);
	int k=tree[l].size+1;
	root=merge(l,r);
	return k;
}
int findval(int i,int k){
	if(tree[lc].size+1==k){
		return tree[i].val;
	}
	if(tree[lc].size>=k){
		return findval(lc,k);
	}
	else{
		return findval(rc,k-tree[lc].size-1);
	}
}
int pre(int i){
	split(root,i,l,r);
	p=l;
	while(tree[i].r){
	  p=tree[p].r;
  }
  root=merge(l,r);
  return p;
}
int back(int i){
	split(root,i,l,r);
	p=r;
	while(tree[p].l){
	  p=tree[p].l;
  }
  root=merge(l,r);
  return p;
}
int n,ans;
int tot;
signed main(){
  srand(1145141919810);
  scanf("%lld",&n);
  forr(i,1,n){
    int opt,x;
    scanf("%lld%lld",&opt,&x);
    if(opt==tot){
      insert(x);
      continue;
    }
    else if(!tree[root].size){
      tot=opt;
      insert(x);
      continue;
    }
    else{
      int p1=pre(x),p2=back(x);
      if(p1||p2){
        ans+=((p1|p2)-tree[p1|p2].val);
        ans%=MOD;
        pop(tree[p1|p2].val);
        continue;
      }
      int pr=x-tree[p1].val,ba=tree[p2].val-x;
      pr>ba?(ans+=ba,pop(ba)):(ans+=pr,pop(pr));
    }
  }
  printf("%lld",ans);
}
2021/6/17 20:23
加载中...