首页 > 其他分享 >[??记录] AtCoder 练习

[??记录] AtCoder 练习

时间:2023-03-20 22:00:11浏览次数:38  
标签:AtCoder 括号 int 练习 dfs 叶子 fa del 记录

3.19

arc066_c (dp,观察)

观察:

  • 只会在负号右边添加 \((/ )\)
  • 两个位置之间至多一个括号。
  • 括号不会嵌套多层。

\(f[i][j]\) 表示处理完 \(i\) 个数,有 \(j\) 个未匹配左括号。

因为钦定只有负号后面加括号,我们可以通过这个找到这个数的符号。

agc033_c (博弈,观察)

发现每次操作就是会让一圈叶子缩进来。

但是如果选了某个叶子操作,会保留这个叶子然后其他的缩没掉。

直径每次减 1 或 2

直接设 \(f[i] = ! f[i - 1] || ! f[i - 2]\)。初值 \(f[1] = 1, f[2] = 0\)。

agc014_d(博弈,观察)

一个我能发现的结论:高桥染一个叶子的父亲,青木则必须染这个叶子。

然后我们可以把这两个点删掉。直到最后如果存在一个点可以拿走,那么高桥就赢了。

但是不会证明充分性。(充分性:按这个策略不行走他一定输。)

但是 OIer 不需要证明。

然后就相当于求树上完美匹配。dfs,分类讨论一下。

void dfs(int x, int fa) {
	for(int y:G[x]) if(y != fa) {
		dfs(y, x);
	}
	if(!del[x]) {
		if(del[fa]) {
			puts("First");
			exit(0);
		} del[x] = del[fa] = 1;
	}
}

标签:AtCoder,括号,int,练习,dfs,叶子,fa,del,记录
From: https://www.cnblogs.com/Lates/p/17238031.html

相关文章