首页 > 其他分享 >[HDU 2509] Be the Winner (博弈、分裂游戏)

[HDU 2509] Be the Winner (博弈、分裂游戏)

时间:2024-10-31 19:59:38浏览次数:1  
标签:HDU return int vi Winner ++ 2509 SG sg

本质上是一个 Anti-Nim Game。考虑如何计算 SG 函数。

如果当前有堆\(x\)个石子,我取出任意个后,一定会把当前堆分为左右两堆,我们可以枚举左右两堆的大小\(l,r\) ,保证\(0\le l + r < x\),则有

\[SG(x) = \mathrm{mex} ( SG(l)\oplus SG(r)) \]

#include <bits/stdc++.h>

using namespace std;

const int inf = INT_MAX / 2;

using vi = vector<int>;

vi g(101, -1);

int mex(vi p) {
    if (p.empty()) return 0;
    ranges::sort(p);
    p.resize(unique(p.begin(), p.end()) - p.begin());
    for (int i = 0; i < p.size(); i++)
        if (i != p[i]) return i;
    return p.size();
}


int sg(int x) {
    if (g[x] != -1) return g[x];
    vi p;
    for (int l = 0; l < x; l++)
        for (int r = 0; l + r < x; r++)
            p.push_back(sg(l) ^ sg(r));
    return g[x] = mex(p);
}

int main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int n;
    cin >> n;

    int res = 0, f = 1;
    for (int i = 1, x; i <= n; i++) {
        cin >> x;
        res ^= sg(x), f &= (x <= 1);
    }
    if ((f != 0 and res == 0) or (f == 0 and res != 0)) cout << "Yes\n";
    else cout << "No\n";
    return 0;
}

标签:HDU,return,int,vi,Winner,++,2509,SG,sg
From: https://www.cnblogs.com/PHarr/p/18518754

相关文章

  • hdu1705 Count the grid
    皮克定理是指一个计算点阵中顶点在格点上的多边形面积公式,该公式可以表示为2S=2a+b-2,其中a表示多边形内部的点数,b表示多边形边界上的点数,s表示多边形的面积。多边形边界上的整数点怎么求呢?当然是gcd啦~~ gcd(x1-x2,y1-y2)就是这条边上整数点的个数。但是仅仅一条边是不准确的......
  • hdu2063过山车
    1、匈牙利算法;2、二分图最大匹配importjava.util.Scanner;publicclassMain{publicstaticbooleanfind(intcur,int[]pre,boolean[][]map,boolean[]vis){for(inti=1;i<pre.length;i++){if(map[cur][i]&&!vis[i]){......
  • Azkaban、oozie、airflow、dolphinschduler 对比分析
    好的,我们可以进一步深入分析Azkaban、Oozie、Airflow和DolphinScheduler的更多技术细节、架构、优缺点,以及在实际场景中的应用情况。1.Azkaban1.1架构组件:WebServer:负责处理用户请求、提交工作流、查看任务状态和管理任务调度。ExecutorServer:负责实际执行......
  • 线段树与二分操作 vases and flowers ——hdu 4614
    操作1,的关键是找到第一只和最后一只空花瓶,完全可以利用二分法查找,找第一只花瓶可以在[X,N]内查找,第一个位置pos1,最后一只花瓶则在[POS1,N]中找,然后更新[POS1,POS2],全部置1即可代码:#include<iostream>usingnamespacestd;constintN=5e4+5;structnode{ intlazy; in......
  • 线段树 transformation——hdu 4578
    问题描述:给定一个数列,数列中所有元素都初始化为0,对其执行多种区间操作操作1:add修改:对区间[L,R]内的所有数加c操作2:multi修改:对区间[L,R]内所有数乘以c操作3:change操作:把区间[L,R]内所有数改为c操作4:sum操作:对区间中的每个数的p次方求和。1<=p<=3输入:有不超过10个测试用例。......
  • 线段树can you answer these queries-------hdu4027
    问题描述:给定一个数列,要求对指定区间内所有数开方,输出查询区间和输入:有很多个测试用例,每个用例第一行输出一个整数N,表示数列有N个数,1<=N<=100000;第二行输入N个整数E,E<2e63;第三行输入整数M,表示M种操作,1<=M<=100000;之后的M行,每行输入3个整数TXY。T=0,表示修改,将区间[L,R]内所......
  • HDU5512
    本题考察裴蜀定理,刚刚学过就写了一下。能够维修的塔就是\(a,b,a-b,a+b,a+2b,a-2b,2a-b,2a+b...\),上述这些塔的位置就符合ax-by的格式,也就是可以使用裴蜀定理了。裴蜀定理为\(ax+by=gcd(a,b)\),也就是说上述的所有能够维修的塔的位置都是\(gcd(a,b)\)的整数倍即为\(n/gcd(a,b)\)。那......
  • HDU 1729 Stone Game
    https://ac.nowcoder.com/acm/contest/34655/C有\(n\)个箱子,第\(i\)个箱子最多放\(s_i\)个石子,当前箱子里的石子数为\(c_i\)。两个人轮流往箱子里放石子,而且每一次放的数量都有限制:不能超过当前箱子内石子数的平方。例如箱子里有\(3\)颗石子,那么下一个人就可以放\(1-9\)......
  • 【hdu 7548】SunBian
    题目链接:hdu7548SunBian(2024“钉耙编程”中国大学生算法设计超级联赛(10))思路:一道比较签到的题。先说结论:1.当n=k时A必胜2.当k=1时,n为奇数A胜,否则B胜3.其余情况全都为B胜证明:1.显然n=k时A可以一回合全部取完2.k=1时双方只能轮流来,显然奇数A胜偶数B胜3.此时A是......
  • hdu7438
    题面给定长度为\(N\)的序列\(a\)。一个序列有很多个子序列,每个子序列在序列中出现了若干次。小马想请你输出序列\(a\)每个非空子序列出现次数的立方值的和,答案对\(998244353\)取模。数据范围:\(n,a_i\le250\)。题解一个很高级的trick,"出现次数的立方值"等价于"我......