sd省队集训d1t1

来源:互联网 发布:看程序员直播 编辑:程序博客网 时间:2024/05/22 14:24

        还在学splay 就用splay a了一个题、、

       全场rank5、、


码:

#include<iostream>#include<cstdio>#include<map>#include<algorithm>using namespace std;#define N 200005int ch[N][2],fu[N],sz[N],v[N],dui[N],rt,k,n,i,linl,ddui[N];struct sr{int wz;int zhi;}woc[N];struct lianbiao{int q;int h;int zhi;}lb[N];int getwh(int o){return  ch[fu[o]][0]==o?0:1;}void up(int o){sz[o]=sz[ch[o][0]]+sz[ch[o][1]]+1;}void set(int o,int wh,int child){ch[o][wh]=child;if(child!=0)fu[child]=o;up(o);}void rotate(int o){int fa=fu[o];int ye=fu[fa];int wh=getwh(o);set(fa,wh,ch[o][wh^1]);set(o,wh^1,fa);fu[o]=ye;if(ye!=0)ch[ye][ch[ye][0]==fa?0:1]=o;}void splay(int o,int tar){for(;fu[o]!=tar;rotate(o))   if(fu[fu[o]]!=tar)   getwh(o)==getwh(fu[o])?rotate(fu[o]):rotate(o);   if(tar==0)   rt=o;}int tot;int xin(int zhi){int now= ++tot;v[now]=zhi;sz[now]=1;lb[zhi].zhi=zhi;return now;}void ins(int zhi){ int o=xin(zhi);int p=rt,l=0;while(p!=0){l=p;if(v[p]<zhi)p=ch[p][1];else p=ch[p][0];}if(l==0){rt=o;return;}if(v[l]>zhi)set(l,0,o);else set(l,1,o);splay(o,0);}void qlianjie(int a,int b){   lb[lb[b].q].h=a;lb[a].q=lb[b].q;lb[a].h=b;lb[b].q=a;}void hlianjie(int a,int b){   lb[lb[a].h].q=b;lb[b].q=a;lb[b].h=lb[a].h;lb[a].h=b;}int find(int zhi){   //if(zhi==0)cin>>n;int wz=0;int p=rt;int l=0;while(p!=0){l=p;if(v[p]<zhi){wz+=sz[ch[p][0]]+1;p=ch[p][1];}else{p=ch[p][0];}}//splay(p,0);p=rt;if(wz==sz[rt]){//跟在最大一个数后面 while(ch[p][1])p=ch[p][1];hlianjie(v[p],zhi);}else{   if(sz[rt]-k>=wz)wz=sz[rt]-k+1;   else wz=wz+1;      while(p!=0){if(wz==sz[ch[p][0]]+1)break;if(wz>sz[ch[p][0]]+1){wz-=(sz[ch[p][0]]+1);p=ch[p][1];}else{p=ch[p][0];}}//if(p==0)cout<<zhi,cin>>n;qlianjie(zhi,v[p]);splay(p,0);}}bool cmp(sr a,sr b){return a.zhi<b.zhi;}int main(){scanf("%d%d",&n,&k);for(i=1;i<=n;i++){scanf("%d",&woc[i].zhi);woc[i].wz=i;    }    sort(woc+1,woc+1+n,cmp);for(i=1;i<=n;i++){ dui[woc[i].wz]=i;ddui[i]=woc[i].zhi;}linl=dui[1];lb[linl].q=0;lb[linl].h=-1;lb[linl].zhi=dui[i];lb[0].h=linl;ins(linl);for(i=2;i<=n;i++){ linl=dui[i];//cout<<linl<<" ";find(linl);ins(linl);}linl=lb[0].h;//printf("\n\n\n");while(linl!=-1){printf("%d\n",ddui[linl]);linl=lb[linl].h;}}


原创粉丝点击