[NC记录]AT2266 [AGC008D] K-th K

command_block

2021-03-01 09:11:43

Personal

**题意** : 给你一个长度为 $n$ 的序列 $X$ ,构造否满足下列条件的序列 $A$ ,或指出无解。 - $a$ 的长度为 $n^2$ ,并数字 $1\sim n$ 都各出现恰好 $n$ 次。 - 数字 $i$ 在 $A$ 中第 $i$ 次出现的位置是 $X_i$。 $n\leq 500$ ,时限$\texttt{2s}$。 ------------ 在被 $X$ 钦定的若干位置上,需要放置的数已经确定,且前后所需放置的个数也已经确定。 于是,哪个数的 $\rm deadline$ 更近就先放哪个数即可。 暴力实现,复杂度即为 $O(n^3)$。 ```cpp #include<algorithm> #include<cstdio> #define MaxN 505 using namespace std; int n,x[MaxN],o[MaxN],ans[MaxN*MaxN]; int main() { scanf("%d",&n); for (int i=1;i<=n;i++){ scanf("%d",&x[i]); ans[x[i]]=i; o[i]=i-1; }x[0]=n*n+2; for (int i=1;i<=n*n;i++){ if (ans[i]){ int p=ans[i]; if (o[p]) {puts("No");return 0;} o[p]=n-p; x[p]=n*n+1; }else { int p=0; for (int k=1;k<=n;k++) if (o[k]&&x[k]<x[p])p=k; if (!p) {puts("No");return 0;} o[ans[i]=p]--; } }puts("Yes"); for (int i=1;i<=n*n;i++) printf("%d ",ans[i]); return 0; } ```