首页 > 其他分享 >CF1864E Guess Game

CF1864E Guess Game

时间:2023-09-11 15:33:06浏览次数:33  
标签:Guess CF1864E 01trie 二进制 高位 Alice Game Bob 位为

原题

翻译

非常好的一道题,不过前半部分的逻辑推理比较难理解,这很博弈

由于或运算是有\(1\)就为\(1\),因此我们对于一对数\((a,b)\),我们不需要看\(a|b\)中为\(0\)的那些位,因此我们只需要考虑\(a|b\)全\(1\)的情况即可

我们考虑一下如果\(Alice\)说"我不知道"说明什么?说明在\(a\)和\(b\)的二进制表示下,\(a\)最高位为\(1\)。否则如果\(a\)最高位为\(0\),则\(b\)最高位一定为\(1\),因此\(Alice\)一定可以推断出\(a < b\)

同理的,在第二轮\(Bob\)这里如果\(b\)的最高位为\(0\),那他可以直接推断出\(a > b\),因此如果\(Bob\)说"我不知道"说明\(b\)的最高位也为\(1\)。但是我们还要多考虑一点,如果\(b\)的最高位为\(1\)但次高位为\(0\),那\(Bob\)也可以推断出\(a > b\),因为\(b\)的次高位为\(0\)就说明\(a\)的次高位一定为\(1\),也可以推断\(a > b\)。因此如果\(Bob\)说"我不知道",就把\(b\)的最高位和次高位都为\(1\)的信息告诉了\(Alice\)

第三轮同理,\(Alice\)也可以判断\(a,b\)的大小关系,或通过说"不知道"来告诉\(Bob\) \(a\)的次高位和次次高位为\(1\)……如此反复,直到一个人找到一位使得\(a,b\)中有一个数为\(0\),或判断\(a=b\)

在发现这样的逻辑后,我们就可以通过\(a\)和\(b\)对每一位二进制枚举来求出操作轮数。

\[\begin{cases} a=b & popcnt(a)+1 \\ a<b & x + [x \mod 2 = 0] \\ a>b & x + [x \mod 2 = 1] \\ \end{cases} \]

其中\(x\)表示\(a\ and\ b\)在二进制下最高位\(0\)的位置(肯定是不算前导\(0\)的),\(popcnt(x)\)表示\(x\)二进制下\(1\)的个数

于是我们就可以得到一个\(O(n^2 \log V)\)的一个做法:暴力枚举选哪两个数,然后在对他们的二进制暴力找到\(x\)


方法1:\(01trie\)

显然看到二进制的题我们首先能想到\(01trie\)这个东西

我们把所有的数都加入\(01trie\)中,枚举一个数\(s_i\)作为被选择的\(a\),然后看有多少个\(b\)满足\(b<a\),然后计算答案即可


方法2: 分治

对于二进制按位贪心的题我们也可以考虑分治。与其说是分治,不如说是一种\(01trie\),但他的特点是没有把树真正的建出来,而是用递归树来代替

我们对于所有的\(s_i\)从高位往低位考虑,对于当前这一位,我们把它分成这一位为\(0\)和\(1\)的部分,分别递归计算贡献,在合并的时候这一位为\(0\)的显然能对为\(1\)的产生贡献

最后再除以总方案数极为要求的答案

标签:Guess,CF1864E,01trie,二进制,高位,Alice,Game,Bob,位为
From: https://www.cnblogs.com/fox-konata/p/17693673.html

相关文章

  • [GAMES101] 我的结课打卡
    ......
  • 【刷题笔记】45. Jump Game II
    题目Givenanarrayofnon-negativeintegers nums,youareinitiallypositionedatthefirstindexofthearray.Eachelementinthearrayrepresentsyourmaximumjumplengthatthatposition.Yourgoalistoreachthelastindexintheminimumnumberofju......
  • 【题解】CF1854E Game Bundles
    你考虑我们需要构造出一组解,显然地这样的解有很多很多种(\({60^{60}}\)显然是及其地大)。那关键是我们如何进行构造。我们很容易知道每个集合里面\(>30\)的数只有一个。所以我们可以在\([1,30]\)中随机\(a_i\),直到满足的组数恰好小于等于\(a_i\),添加的时候维护数组\(f_i......
  • 467B - Fedor and New Game
    B.FedorandNewGamehttps://codeforces.com/problemset/problem/467/B"""思路:1.暴力方法:通过循环二进制之后的,逐个位与fedor进行判断,通过取余,如果最后不同的超过3个就计+12.解决方法:通过异或^进行判断,然后转成二进制,统计1的数量,就是不同的数量,然后相加"""#利用异或......
  • AtCoder Beginner Contest 201 D - Game in Momotetsu World
    D-GameinMomotetsuWorld原题链接题意有一个H×W的方格,每个方格里写着'+'或'-'有一个初始在(1,1),(也就是左上角)的棋子,Takahashi和Aoki轮流向右或向下移动(Takahashi先手)。移动到写着'+'的方格上后,进行该步移动的玩家分数+1。否则该玩家分数−1,走到右下......
  • Heap 0x07--HGAME 2023 week2--heap
    一个拖了很久的复现,这个比赛在23年初,但是年初的时候水平实在是不够,直接摸掉了后续复现的时候也只有四月多复现到hgameweek2的那个非栈上fmtstr拖着拖着就把剩的三个堆题拖到现在了,开始复现,同时也算是对堆的一种学习吧0x01fast_note先从2.23的堆入手,进去之后一眼uaf复现主要......
  • 关于UE GAS GameplayEffect中SetByCaller的解析
    在GAS中,GameplayEffect(简称GE)里面,在涉及到Magnitude的地方,针对MagnitudeCalculationType都会有一个选项“SetByCaller”,其本质,是把Magnitude的具体数值,交由开发者在代码中决定。如果设置为“SetByCaller”,它都需要填写一个DataTag,其本质是,在GameplayEffect实例中,它有一个......
  • Shadow Mapping (Games202)
    ShadowMapping(Games202)2-PassAlgorithmPass1.RenderfromLightPass1需要知道光线能照射到的点,也就是从光源所在的视角去渲染模型,有哪些是能被渲染出,哪些会被遮挡住而不被渲染。我们知道深度测试所做的就是从CameraView去看哪些点是能被看到,忽略那些被遮挡的点。所以......
  • [AGC007D] Shik and Game 题解
    一道有意思的\(\text{dp}\)呀。思路我们容易发现,一个点最多会往回走一次。也就是每一个点最多被遍历三次。因此,我们可以考虑每个点的贡献。\[dp_i=\min_{j=1}^{i-1}dp_j+x_i-x_j+\max(2\times(x_i-x_{j+1}),T)\]其中,\(dp_i\)表示前\(i\)个金币全部取完,此时位于第\(i\)......
  • CF36D New Game with a Chess Piece 题解
    前言:都大半年没在洛谷上提交过题解了。SPOJ上有双倍经验,题号为SP7602。我看题解区的大佬们有的正经用博弈论做,有的打表,但是感觉没有讲得很形象,这篇题解将生动讲述打表做法,同时为了让大家在感性理解后,还可以理性理解,会附上证明(这部分参考了别的题解)。正文:Step1:打表找规律......