AtCoder AGC033C Removing Coins (博弈论)

题目链接

https://atcoder.jp/contests/agc033/tasks/agc033_c

题解

终于会做点最简单的博弈论了……
首先题目中操作的含义就是选定一个点,把所有不是这个点的叶子删掉(如果这个点不是叶子就删所有叶子)。
对于任何一棵点数不少于\(3\)的树,一定存在一个点(比如非叶子节点),使得对该点操作之后直径减少\(2\);同时一定存在一个点(比如直径的端点),使得对该点操作后直径减少\(1\);同时不存在任何一种操作使得直径发生其他的变化。因此这是一个Bash博弈的模型,答案与直径长度模\(3\)的值有关。
设直径长度(点数)为\(l\). 若\(l=1\)则先手必胜,\(l=2\)则后手必胜。后面就变成了刚才讨论的情况,因此当且仅当直径长度\(\mod 3=2\)时后手必胜。
时间复杂度\(O(n)\).

代码

#include<bits/stdc++.h>
#define llong long long
using namespace std;

inline int read()
{
    int x = 0,f = 1; char ch = getchar();
    for(;!isdigit(ch);ch=getchar()) {if(ch=='-') f = -1;}
    for(; isdigit(ch);ch=getchar()) {x = x*10+ch-48;}
    return x*f;
}

const int N = 2e5;
struct Edge
{
    int v,nxt;
} e[(N<<1)+3];
int fe[N+3];
int fa[N+3];
int len[N+3];
int n,en,mx;

void addedge(int u,int v)
{
    en++; e[en].v = v;
    e[en].nxt = fe[u]; fe[u] = en;
}

void dfs(int u)
{
    for(int i=fe[u]; i; i=e[i].nxt)
    {
        int v = e[i].v; if(v==fa[u]) continue;
        fa[v] = u; dfs(v);
        mx = max(mx,len[u]+len[v]+1);
        len[u] = max(len[u],len[v]+1);
    }
}

int main()
{
    scanf("%d",&n);
    for(int i=1; i<n; i++) {int u,v; scanf("%d%d",&u,&v); addedge(u,v); addedge(v,u);}
    dfs(1);
    if(mx%3==1) {puts("Second");}
    else {puts("First");}
    return 0;
}

原文地址:https://www.cnblogs.com/suncongbo/p/12227637.html

时间: 2024-10-16 21:50:17

AtCoder AGC033C Removing Coins (博弈论)的相关文章

AGC033C Removing Coins(博弈论+思维)

这也太强了8--AtCoder真的道道好题 考虑一条链上的情况--这不SB题吗,按\(\% 3\)的余数考虑:\(\% 3\)余2后手赢,否则先手赢 扩展到树上,每次删除都会使直径删除1个或2个点.直径删完时其它链肯定也删完了,所以对直径按照上边的方法预处理下SG函数就行了 代码 #include <bits/stdc++.h> #define N 200005 #define pb push_back using namespace std; bool SG[N]; vector<in

ACM: Gym 101047M Removing coins in Kem Kadr&#227;n - 暴力

Gym 101047M Removing coins in Kem Kadrãn Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Practice Description standard input/output Andréh and his friend Andréas are board-game aficionados. They know many of their friends

CodeForces Gym 101047M Removing coins in Kem Kadr&#227;n 暴力

Removing coins in Kem Kadrãn Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Gym 101047M Description standard input/output Andréh and his friend Andréas are board-game aficionados. They know many of their friends would lo

Gym 101047M Removing coins in Kem Kadr&#227;n

给定一个序列,只能拿走D,隔壁的会翻转,问能否全部拿走. 注意到如果能拿走的话,拿D的顺序是没关系的.模拟即可 #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define inf (0x3f3f3f3f) typedef long long int LL; #in

AtCoder刷题记录

神仙AtCoder思维量巨大,很适合我用来提高智商qwq ARC066C Addition and Subtraction Hard 首先要发现两个性质. 加号右边不会有括号 显然,有括号也可以被删去. \(op_i\)和\(A_{i+1}\)之间只会有一个括号 有多个括号的话只保留最外边那个,显然答案不变. 然后就可以定义状态:\(dp_{i,j}\)表示前\(i\)个数,还有\(j\)个未闭合的左括号,得到的最大答案. 由于只有减号右边有括号,所以只要知道左边有几个未闭合的左括号,就可以知道

Atcoder ABC158 F - Removing Robots 线段树+选集合类dp

Atcoder ABC158 F - Removing Robots 线段树+dp 题意 一条直线上有机器人,每个机器人有一个激活后行进值D[i],当激活它时,它就会向x轴方向走D[i]距离.进行后它就会离开坐标轴.激活有两种方式,一种是手动激活,一种是当一个机器人在激活状态时的行进距离[x[i],x[i]+D[i])注意右开区间,碰到了别的机器人,那个被碰的机器人就会被激活.同时它如果碰到了别的也会激活别的,连锁反应.问你可以任意选择任意个机器人激活,激活后剩余机器人的集合有多少种 思路 这种

AtCoder ABC 158F Removing Robots

题目链接:https://atcoder.jp/contests/abc158/tasks/abc158_f 题目大意 有$N$个机器人分布在数轴上不同的位置,初始为未激活状态,作为上帝,你可以手动激活任意数量的机器人,当第$i$个机器人被激活时,它会向前走$D_i$个单位长度然后自爆,并且坐标区间在$[X_i,~Di)$上的机器人也会被激活往前走,从而触发连锁激活. 当你选定一些机器人激活后,最后剩下的机器人按编号组成集合$S$,问一共有多少个不同的集合$S$? 分析 对于每一个机器人,无非有

【博弈论】【SG函数】【线段树】Petrozavodsk Summer Training Camp 2016 Day 9: AtCoder Japanese Problems Selection, Thursday, September 1, 2016 Problem H. Cups and Beans

一开始有n个杯子,每个杯子里有一些豆子,两个人轮流操作,每次只能将一个豆子移动到其所在杯子之前的某个杯子里,不过可以移动到的范围只有一段区间.问你是否先手必胜. 一个杯子里的豆子全都等价的,因为sg函数是异或起来的值,所以一个杯子里如果有偶数个豆子,就没有意义. 用sg(i)表示i杯子中的豆子的sg值,sg(i)就是其所能移动到的那段杯子的区间的sg值的mex(未出现的最小非负整数).可以用线段树去做.是经典问题. 由于每次看似是后缀询问,实则是全局询问,故而主席树完全是多余的. 回顾一下区间m

hdu 1536 S-Nim 博弈论,,求出SG&#39;函数就可以解决

S-Nim Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4975    Accepted Submission(s): 2141 Problem Description Arthur and his sister Caroll have been playing a game called Nim for some time now