「DCOI」兜心の顶

题目大意

试构造一棵树,使得树的直径、树的重心、树的直径的重心唯一且树的重心与树的直径的重心不同。

解题思路

算是一眼的构造题吧。。。

显然树的直径长度只能为奇数,树的直径的重心即为树的直径的中点。

再考虑树的重心与树的直径的重心,先简单想像,现在的树只是一条长度为奇数的链,他的重心即为链的中点。

现在考虑在这条链上加点,使得直径唯一且树的重心与树的直径的重心不同。

首先,我们假定原来的链,为唯一的直径;链的中点,为唯一的树的直径的中点。

那么,当前的树的重心即为链的中点,也就是树的直径的中点。

再考虑将重心转移,最简单得,将新加的每一个点与树的直径的中点旁的固定一个点连边,已达到转移重心的效果。

手动构造可以发现,当 n8n \leq 8 时,本题无解。其他情况均有解。

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;
}
posted @ 2021-11-13 23:05  蒟蒻orz  阅读(2)  评论(0编辑  收藏  举报  来源