cf1586F. Defender of Childhood Dreams
题解
拆成尽量平均的 $k$ 个区间,然后不在一个区间内的点两两连颜色为层数的边,然后递归下去做即可。
正确性是对的,这样答案就是 $log_{k}n$ 。
然后证明这就是下限的话就用归纳证明。
代码
#include <bits/stdc++.h> using namespace std; const int N=1005; int n,k,a[N][N],m; void solve(int l,int r,int d){ int len=r-l+1; if (len<2) return;m=max(m,d); int u=len/k,v=len%k; for (int i=1;i<=v;i++){ for (int j=l;j<=l+u;j++) for (int x=l+u+1;x<=r;x++) a[j][x]=d; solve(l,l+u,d+1);l+=u+1; } for (int i=1;i<=k-v;i++){ for (int j=l;j<l+u;j++) for (int x=l+u;x<=r;x++) a[j][x]=d; solve(l,l+u-1,d+1);l+=u; } } int main(){ scanf("%d%d",&n,&k); solve(1,n,1); printf("%d\n",m); for (int i=1;i<n;i++) for (int j=i+1;j<=n;j++) printf("%d%c",a[i][j],(i==n-1&&j==n)?'\n':' '); return 0; }