1 条题解

  • 0
    @ 2026-7-4 11:25:23

    //You can check out any time you like
    #include <cstdio>
    #include <iostream>
    #include <queue>
    using namespace std;
    const int M = 500005;
    int read()
    {
    	int x=0,f=1;char c;
    	while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
    	while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
    	return x*f;
    }
    int n,k,p[M],q[M],d[M],mx[M<<2],ch[M][2];
    void ins(int i,int l,int r,int id,int c)
    {
    	if(l==r) {mx[i]=c;return ;}
    	int mid=(l+r)>>1;
    	if(id<=mid) ins(i<<1,l,mid,id,c);
    	else ins(i<<1|1,mid+1,r,id,c);
    	mx[i]=max(mx[i<<1],mx[i<<1|1]); 
    }
    int ask(int i,int l,int r,int L,int R)
    {
    	if(L>r || l>R) return 0;
    	if(L<=l && r<=R) return mx[i];
    	int mid=(l+r)>>1;
    	return max(ask(i<<1,l,mid,L,R),
    	ask(i<<1|1,mid+1,r,L,R));
    }
    signed main()
    {
    	n=read();k=read();
    	for(int i=1;i<=n;i++) q[read()]=i;
    	for(int i=1;i<=n;i++)
    	{
    		int x=q[i];
    		ch[x][0]=q[ask(1,1,n,x-k+1,x)];
    		ch[x][1]=q[ask(1,1,n,x,x+k-1)];
    		d[ch[x][0]]++;d[ch[x][1]]++;
    		ins(1,1,n,x,i);
    	}
    	d[0]=-1;priority_queue<int> q;
    	for(int i=1;i<=n;i++) if(!d[i]) q.push(i);
    	int nw=n;
    	while(!q.empty())
    	{
    		int u=q.top();q.pop();p[u]=nw--;
    		for(int i=0;i<2;i++)
    			if(!(--d[ch[u][i]]))
    				q.push(ch[u][i]);
    	}
    	for(int i=1;i<=n;i++)
    		printf("%d\n",p[i]);
    }
    
    
    • 1

    信息

    ID
    8367
    时间
    5000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    22
    已通过
    3
    上传者