题解 CF1583F 【Defender of Childhood Dreams】
一篇来自蒟蒻的题解,不喜误喷,有误请私信。
考场上都没来得及看题,wtcl。
题目简述
有
题目分析
是一道构造题,代码很好写,只要想清楚构造的方法。
首先,我们很容易发现(甚至可以不发现),只要保证每条长度为
我们先将
同理,将
接下来,考虑将这
用反证法:假设有一条长度为
定义:一个
-
如果都是颜色
1 ,那么一定在同一个块内。已经证明了不可以。 -
如果都是颜色
2 ,那么采用贪心:从第一个块中任意一个点出发,走颜色为2 的边,一定回到第二个块中,再走走走,到第k 个块(即组内最后一个块),整条路径的长度也只有k-1 ,不可能到k 。
总上,假设不成立,故原名题得证。
证明了这点,接下来又是“以此类推”了。以
所以最后最少的颜色数量是
Talk is cheap, show me the code!
Codeforces Status
int n=read(),k=read();
int ans=1,sum=k;
while(sum<n) ans++,sum*=k;//计算⌈logkN⌉
printf("%d\n",ans);
For(i,0,n-1){
For(j,i+1,n-1){
int x=i,y=j,d=0;
while(x!=y) x/=k,y/=k,d++;//算每条边属于哪种跨度的
printf("%d ",d);
}
}