1 条题解
-
0

//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
- 上传者