比赛-不知道从几开始编号的训练赛 1

Posted 1218ghcred

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了比赛-不知道从几开始编号的训练赛 1相关的知识,希望对你有一定的参考价值。

A. Fibonacci

没有看见 \(f(0) = 0, f(1) = 1\) ,以为是自己想的那种 Fibonacci ,就跪了。第三次看错题啦,上次好像强行把一次函数看成指数级函数 Orz 。

B. 一样远

LCA ,再用节点 siz 处理一下。

C. 拆网线

不要被树上 DP 误导,和什么“监管警察”那道题也没有一点关系。考虑贪心,尽量多找仅一条边连接的两个点组成的二元组,或者把这个过程用 DP 模拟出来也行。

改悔

#include <cstdio>
#include <algorithm>
#include <ctype.h>
#include <vector>

using namespace std;

char *p1, *p2, buf[1 << 20];

inline char gc()
{
//  return getchar();
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin))==p1?EOF:*p1++;
}

template <typename T>
void rd(T &num)
{
    char tt;
    bool flag;
    while (!isdigit(tt = gc()) && tt != '-');
    if (tt == '-') num = 0, flag = true;
    else num = tt - '0', flag = false;
    while (isdigit(tt = gc()))
        num = num * 10 + tt - '0';
    if (flag) num = -num;
    return;
}

const int _N = 101000;

int TTT, Ans, mk[_N];
vector<int> G[_N];

void dfs(int p, int dad)
{
    for (int i = G[p].size() - 1; i >= 0; --i) {
        int v = G[p][i];
        if (v == dad) continue;
        dfs(v, p);
        if (!mk[p] && mk[v] == 1)
            mk[p] = 2, ++Ans;
    }
    if (!mk[p]) mk[p] = 1;
    return;
}

inline void inss(int a, int b)
{
    G[a].push_back(b);
    return;
}

int main()
{
    int TTT;
    rd(TTT);
    while (TTT--) {
        int N, K;
        rd(N), rd(K);
        for (int i = 1; i <= N; ++i)
            G[i].clear(), mk[i] = 0;
        for (int a, i = 2; i <= N; ++i)
            rd(a), inss(a, i), inss(i, a);
        Ans = 0;
        dfs(1, 0);
        if (Ans * 2 >= K)
            printf("%d\n", (K + 1) / 2);
        else
            printf("%d\n", Ans + (K - Ans * 2));
    }
    return 0;
}

别看错题了 Orz ……
别想多了啊,比较恶心的题做不出来时考虑换换思路,比如贪心,或者猜结论之类的。

以上是关于比赛-不知道从几开始编号的训练赛 1的主要内容,如果未能解决你的问题,请参考以下文章

2020劳动节训练赛

16年区域赛训练计划

比赛-训练赛 (15 Aug, 2018)

比赛-thh学长的训练赛 (Aug 16, 2018)

比赛-CioCio的训练赛 (Aug 18, 2018)

比赛-暑假训练赛1 (26 Jul, 2018)