「DCOI」兜心の顶
题目大意
试构造一棵树,使得树的直径、树的重心、树的直径的重心唯一且树的重心与树的直径的重心不同。
解题思路
算是一眼的构造题吧。。。
显然树的直径长度只能为奇数,树的直径的重心即为树的直径的中点。
再考虑树的重心与树的直径的重心,先简单想像,现在的树只是一条长度为奇数的链,他的重心即为链的中点。
现在考虑在这条链上加点,使得直径唯一且树的重心与树的直径的重心不同。
首先,我们假定原来的链,为唯一的直径;链的中点,为唯一的树的直径的中点。
那么,当前的树的重心即为链的中点,也就是树的直径的中点。
再考虑将重心转移,最简单得,将新加的每一个点与树的直径的中点旁的固定一个点连边,已达到转移重心的效果。
手动构造可以发现,当 时,本题无解。其他情况均有解。
CODE
#include <bits/stdc++.h>
using namespace std;
int read()
{
char c = getchar();
int x = 0, f = 1;
for (; c < '0' || c > '9'; c = getchar())
if (c == '-')
f = -1;
for (; c >= '0' && c <= '9'; c = getchar())
x = (x << 1) + (x << 3) + (c ^ 48);
return x * f;
}
void write(int x)
{
if (x < 0)
x = -x, putchar('-');
if (x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
int n, k;
signed main()
{
n = read();
if (n < 9)
{
write(-1);
}
else
{
write(n);
putchar('\n');
for (register int i = 1; i <= 6; ++i)
{
write(i);
putchar(' ');
write(i + 1);
putchar('\n');
}
for (register int i = 1; i <= n - 7; ++i)
{
write(3);
putchar(' ');
write(i + 7);
putchar('\n');
}
}
return 0;
}
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18122090