1. 程式人生 > >AtCoder Grand Contest 008 D

AtCoder Grand Contest 008 D

題意

給出n個數組x[1..n],要求構造一個長度為n*n的陣列a,使得a中1到n每個數恰好出現n次,且對於任意的i,有從左到右第i個出現的i的下標為x[i]。
n<=500

分析

直接把1到n按照x從小到大排序,對於每個i,把前i個i填進去。
然後再從小到大把剩下的位置補完即可。

程式碼

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std
; const int N=505; int n,x[N],f[N],a[N*N+N]; bool cmp(int p,int q) { return x[p]<x[q]; } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&x[i]),f[i]=i; sort(f+1,f+n+1,cmp); int now=1; for (int i=1;i<=n;i++) { int w=f[i];a[x[w]]=w; for
(int j=1;j<w;j++) { while (a[now]) now++; a[now]=w; } if (now>x[w]) {puts("No");return 0;} } for (int i=1;i<=n;i++) { int w=f[i]; for (int j=1;j<=n-w;j++) { while (a[now]) now++; if
(now<x[w]) {puts("No");return 0;} a[now]=w; } } puts("Yes"); for (int i=1;i<=n*n;i++) printf("%d ",a[i]); return 0; }