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;
}

 

posted @ 2021-11-11 14:36  xjqxjq  阅读(39)  评论(0编辑  收藏  举报