还在学splay 就用splay a了一个题、、
全场rank5、、
码:
#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
using namespace std;
#define N 200005
int 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;
}
}