Splay板子求调(玄2关)
查看原帖
Splay板子求调(玄2关)
481527
AC_CSP楼主2023/8/23 15:35

样例都过不了,貌似Splay旋出问题了,求助qwq

#include<bits/stdc++.h>
#define D for(int i=1;i<=Splay::cnt;i++)cout<<i<<" "<<Splay::val[i]<<" "<<Splay::ch[i][0]<<" "<<Splay::ch[i][1]<<" "<<Splay::fa[i]<<" "<<Splay::siz[i]<<" "<<Splay::tag[i]<<"\n"
using namespace std;
const int N=1e6+7;
namespace Splay{
 int ch[N][2],tag[N],siz[N],rt,val[N],cnt,fa[N];
 inline bool get(int x){
  return x==ch[fa[x]][1];
 }
 inline void update(int x){
  siz[0]=0;
  siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1;
 }
 inline void push_down(int x){
  if(tag[x]){
   swap(ch[x][0],ch[x][1]);
   tag[x]=0;
   tag[ch[x][0]]^=1;
   tag[ch[x][1]]^=1;
  }
 }
 inline void rotate(int x){
  int y=fa[x],z=fa[y];
  int opt=get(x);
  push_down(z),push_down(y),push_down(x);
  if(z) ch[z][get(y)]=x; 
  ch[y][opt]=ch[x][opt^1];
  if(ch[x][opt^1]) fa[ch[x][opt^1]]=y;
  ch[x][opt^1]=y;
  fa[x]=z,fa[y]=x;
  update(y),update(x),update(z);
 }
 inline void Splay(int x,int t){
  for(int f=fa[x];f=fa[x],f!=t;rotate(x))
   if(fa[f]!=t) rotate(get(x)==get(f)?f:x);
  if(t==0) rt=x;
 }
 inline void insert(int x){
  if(!rt){
   rt=++cnt;
   val[cnt]=x;
   update(x);
   return;
  }
  int cur=rt,f=0;
  while(1){
   f=cur;
   cur=ch[cur][x>val[cur]];
   if(!cur){
   	val[++cnt]=x;
   	fa[cnt]=f;
   	ch[f][x>val[f]]=cnt;
   	update(cnt),update(f);
   	Splay(cnt,0);
   	return;
   }
  }
 }
 inline int nxt(){
  push_down(rt);
  int cur=ch[rt][1];
  while(1){
   push_down(cur);
   if(!ch[cur][0]) break;
   cur=ch[cur][0];
  }
  return cur;
 }
 inline void reserve(int l,int r){
  Splay(l,0),Splay(r,l);
  tag[ch[r][0]]^=1;
 }
}
int n;
pair<int,int> a[N];
int b[N];
inline bool cmp(pair<int,int> x,pair<int,int> y){
 if(x.first==y.first) return x.second<y.second;
 return x.first<y.first;
}
int main(){
 //ios::sync_with_stdio(false);
 //cin.tie(0),cout.tie(0);
 cin>>n;
 for(int i=1;i<=n;i++){
  cin>>a[i].first;
  a[i].second=i;
 }
 sort(a+1,a+n+1,cmp);
 b[0]=1,b[n+1]=2;
 for(int i=1;i<=n;i++){
  b[i]=a[i].second+2;
 }
 Splay::insert(0);
 Splay::insert(n+1);
 for(int i=1;i<=n;i++){
  Splay::insert(i);
 }
 for(int i=1;i<=n;i++){
  int p=b[i];
  Splay::Splay(p,0);
  cout<<Splay::siz[Splay::ch[p][0]]<<" ";
  //cout<<"\n";D;
  p=Splay::nxt();
  int q=b[i-1];
  //cout<<i<<" "<<q<<" "<<p<<"\n";
  Splay::reserve(q,p);
 }
 return 0;
}
2023/8/23 15:35
加载中...