CodeVS-2573-黑匣子
阿新 • • 發佈:2017-05-13
insert 出發 can codevs light search 刷題 pre its
看到題目感覺有點壞...
區間第k大,插入某個數...看起來怎麽那麽像主席樹...、
tmd我不會
然後看看分類....堆?花了30min亂打一波優先隊列...突然想起來stl不能直接輸出q[k]。。。
然後轉換思路...嗯,從樹的角度出發...突然想起某道題...戳我
這樣就變成了模板提...不過對模板不熟...調了3h+才發現有個小錯誤>_<(蒟蒻就要多刷題...)
於是就變成了一道送溫暖提(Tjm:打波splay暖暖手)
題目鏈接:http://codevs.cn/problem/2573/
代碼:
#include<bits/stdc++.h> #define ll long long #define maxn 60010 using namespace std; int num[maxn],son[maxn][3],f[maxn],value[2000000],data[maxn]; int root,tot,n,m,a[maxn]; void rotate(int x,int w){ int y=f[x]; num[y]=num[y]-num[x]+num[son[x][w]]; num[x]=num[x]-num[son[x][w]]+num[y]; son[y][3-w]=son[x][w]; if(son[x][w]) f[son[x][w]]=y; f[x]=f[y]; if(f[y]){ if(son[f[y]][1]==y) son[f[y]][1]=x; else son[f[y]][2]=x; } f[y]=x;son[x][w]=y; } void splay(int x){ while(f[x]!=0){ int y=f[x]; if(f[y]==0){ if(son[y][1]==x) rotate(x,2); else rotate(x,1); } else if(son[f[y]][1]==y) if(x==son[y][1]){ rotate(y,2);rotate(x,2); } else{ rotate(x,1);rotate(x,2); } else{ if(x==son[y][2]){ rotate(y,1);rotate(x,1); } else{ rotate(x,2);rotate(x,1); } } } root=x; } int search(int x,int w){ while(data[x]!=w){ if(w==data[x]) return x; if(w<data[x]){ if(son[x][1]==0) break; x=son[x][1]; } else{ if(son[x][2]==0) break; x=son[x][2]; } } return x; } void insert(int w){ bool flag; if(tot==0){ tot=1; f[1]=0;num[1]=1;data[1]=w;root=1;value[1]=1; return; } int k=search(root,w); int kk; if(data[k]==w){ value[k]++;kk=k; flag=1; } else{ tot++;data[tot]=w;f[tot]=k;value[tot]=1;num[tot]=1; if(data[k]>w) son[k][1]=tot; else son[k][2]=tot; flag=0; } while(k){ num[k]++; k=f[k]; } if(flag) splay(kk);else splay(tot); } int kth(int x,int w){ int i=root; while(!((x>=num[son[i][w]]+1)&&(x<=num[son[i][w]]+value[i]))&&(i!=0)){ if(x>num[son[i][w]]+value[i]){ x=x-num[son[i][w]]-value[i]; i=son[i][3-w]; } else i=son[i][w]; } int tmp=i; splay(i); return tmp; } int main(){ int last=1; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=m;i++){ int x; scanf("%d",&x); for(int j=last;j<=x;j++) insert(a[j]); last=x+1; printf("%d\n",data[kth(i,1)]); } }
CodeVS-2573-黑匣子