比赛-不知道从几开始编号的训练赛 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的主要内容,如果未能解决你的问题,请参考以下文章