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<int> g[N];
int len=0,dep[N],p;

void dfs(int x){
    if(dep[x]>len) len=dep[x],p=x;
    for(int i=0;i<g[x].size();++i){
        if(!dep[g[x][i]]){
            dep[g[x][i]]=dep[x]+1;
            dfs(g[x][i]);
        }
    }
}

int main(){
    int n,i,a,b;
    scanf("%d",&n);
    for(i=1;i<n;++i){
        scanf("%d%d",&a,&b);
        g[a].pb(b),g[b].pb(a);
    }
    SG[1]=1,SG[2]=0,dep[1]=1;
    for(i=3;i<=n;++i){
        if(i%3==0) SG[i]=1;
        else SG[i]=(i%3)&1;
    }
    dfs(1);
    memset(dep,0,sizeof(dep)),dep[p]=1;
    dfs(p);
    if(SG[len]) puts("First");
    else puts("Second");
} 

原文地址:https://www.cnblogs.com/PsychicBoom/p/10868971.html

时间: 2024-10-10 21:06:03

AGC033C Removing Coins(博弈论+思维)的相关文章

AtCoder AGC033C Removing Coins (博弈论)

题目链接 https://atcoder.jp/contests/agc033/tasks/agc033_c 题解 终于会做点最简单的博弈论了-- 首先题目中操作的含义就是选定一个点,把所有不是这个点的叶子删掉(如果这个点不是叶子就删所有叶子). 对于任何一棵点数不少于\(3\)的树,一定存在一个点(比如非叶子节点),使得对该点操作之后直径减少\(2\):同时一定存在一个点(比如直径的端点),使得对该点操作后直径减少\(1\):同时不存在任何一种操作使得直径发生其他的变化.因此这是一个Bash博

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

【bzoj1299】[LLH邀请赛]巧克力棒(博弈论思维题)

题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1299 首先我们把每根巧克力棒看成一堆石子,把巧克力棒的长度看作石子的个数,那么原问题就可以看成一个经典的nim问题(取石子问题)的变种,它和原问题的区别在于每堆石子需要经过一步操作解封后才能从里面取出石子. 这道博弈题的思维方式和普通题不太一样,不能通过简单的构造sg函数的方法解决.但是我们可以注意到它和普通的nim游戏的一些相同之处:即同样是从几堆石子中从某一堆拿若干个石子出来.即

AtCoder刷题记录

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

在北京,如果你有幸地摇到号,博弈论或许可以帮你便宜地买到车

(书名:<预言家的博弈>) 如果你在北京摇到号了,大部分人下一步就是去4S店买小爱车,慢点,你可以先看看下面的文章,或许会对你有帮助,如果买其他大宗标准物件,你也可以试试这个方法. 假如你打算买辆新车,你是亲自去4S 店购车,还是通过网上比价购车呢?一跨入4S 店的大门,你几乎就输定了,因为,你会把手中所有重要的信息全部亮给4S 店,而对市场真实情况知之甚少,你不知道拿到的价格是不是最好的.你如果通过网上比价购车,但网上的报价也不可靠.购买新车的最好办法就是用博弈论思维:给经销商打电话而不是跟

IT人生知识分享:博弈论的理性思维

背景: 昨天看了<最强大脑>,由于节目比较有争议性,不知为什么,作为一名感性的人,就想试一下如果自己理性分析会是怎样的呢? 过程是这样的: 中国队(3人)VS英国队(4人). 1:李建东(队长)出战,[并说中国队不胜就再不参加最强大脑]3局过后,打平,双方都没脑力进行下一轮,所以评委各得1分,结果:1V1. 2:苏XX(忘名了)出战,打败对手,结果:2V1. 3:申一帆出战,失败,结果2V2平(同时申一帆情绪失控离开节目现场,经节目组一番说辞后回归节目) 问题来了:最后一战,谁出站,在大屏幕播

思维+博弈论:字符串操作

传送门:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1005&cid=856 #include<iostream> using namespace std; int main() { int T; cin>>T; while(T--) { string a; cin>>a; int len=a.length(); int b; for(int i=0;i<len;i++) { if(