题目简述:给定$n \leq 10^5$个三元组$(b_i, w_i, r_i)$,其中$10^5 \leq b_i < w_i < r_i \leq 10^5$,以及一个限制参数$f$。一个正整数$k$是【好】的,若其为质数,或者为两个(可以相同的)质数之积。A和B进行双人博弈:

在A的回合:A进行一次操作,选择一个$1 \leq i \leq n$和一个【好】数$k \neq f$,将$(b_i, w_i, r_i)$变为$(b_i+k, w_i, r_i)$或者变为$(b_i+k, w_i+k, r_i)$;

在B的回合:B进行一次操作,选择一个$1 \leq i \leq n$和一个【好】数$k \neq f$,将$(b_i, w_i, r_i)$变为$(b_i, w_i, r_i-k)$或者变为$(b_i, w_i-k, r_i-k)$。

一次操作是合法的,如果这个操作之后仍然满足$b_i < w_i < r_i$。第一个无法进行合法操作的一方输掉此次博弈。

假设二人的决策是最优的,问:1. 若$A$先手则谁赢;2. 若$B$先手则谁赢。

解:code

建模:

令$x_i = w_i-b_i, y_i = r_i-b_i$,一个三元组$(b_i, w_i, r_i)$则可以被二元组$(x_i, y_i)$描述,因为我们只会关心他们的相对位置。

则在A和B的回合都是:将$(x_i, y_i)$变为$(x_i-k, y_i)$或者$(x_i, y_i-k)$。而且每次操作后,要求满足$x_i > 0$且$y_i > 0$。

于是,一组$(x_i, y_i)$相当于是两个独立的“取石子游戏”。与传统“取石子游戏”不同的地方则是只允许每次从一堆石子中拿出【好】数个石子。

从而,整个博弈就化为了$2n$个独立的“取石子游戏”。

SG函数:

令$\text{SG}(n)$表示有$n$个石子的“取石子游戏”的SG函数值,则

$$ \text{SG}(n) = \begin{cases} \operatorname{mex}\{ \text{SG}(n-k): k \leq n\text{是好数} \} & n \geq 1 \\ 0 & n = 0 \end{cases}, $$

其中$\text{mex} S$表示集合$S$中未出现的最小非负整数。

观察:当$n \leq 2\times 10^5$时,$\text{SG}(n) \leq 100$。(???)

求解出SG函数值后,根据Sprague-Grundy定理,将$2n$个独立的“取石子游戏”的SG函数值作异或(xor)得到整个博弈的SG函数值。

位运算优化:

我们维护$f[i][j]$表示SG值为$i$的所有已处理的状态是否有向状态$j$的转移。令$u[i]$表示$i$是否是【好】数。若$f[i]$和$u$均用bitset存储,则SG函数的计算以及$f[i][j]$可以如下方式维护:

f[0] = u;
for (int i = 1; i <= 200000; ++ i)
{
for (SG[i] = 0; f[SG[i]][i]; ++ SG[i]);
f[SG[i]] |= u<<i;
}

  

时间复杂度为$O(n^2/32)$,空间复杂度$O(nm/32)$,其中$m$为最大可能的SG函数值。

注:注意到当$i$较大时,"f[SG[i]] |= u<<i"还有优化空间,因为u的高位bit在运算中是无用的。可自己实现bitset做到此优化。code2

CodeForces 1091H. New Year and the Tricolore Recreation的更多相关文章

  1. Good Bye 2018 (A~F, H)

    目录 Codeforces 1091 A.New Year and the Christmas Ornament B.New Year and the Treasure Geolocation C.N ...

  2. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  3. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  4. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  5. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  6. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  7. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  8. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

  9. CodeForces - 696B Puzzles

    http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...

随机推荐

  1. iOS7 文本转语音 AVSpeechSynthesizer -转载-

    http://www.cnblogs.com/qingjoin/p/3160945.html iOS7 的这个功能确实不错.我刚试了下,用官方提供的API ,简单的几句代码就能实现文本转语音! Xco ...

  2. OpenStack 使用Ceph 配置指导

    概述 Ceph 作为分布式文件系统,不但具有高可靠性.高扩展性.高性能. 也是统一存储系统.支持对象存储.块存储.文件存储,本文介绍怎样使用Ceph 块存储作为OpenStack的Glance.Nov ...

  3. java timer 指定某时间点执行

    package com.northeasttycoon.service; import java.util.Calendar;import java.util.Timer;import java.ut ...

  4. 基于zookeeper或redis实现分布式锁

    前言 在分布式系统中,分布式锁是为了解决多实例之间的同步问题.例如master选举,能够获取分布式锁的就是master,获取失败的就是slave.又或者能够获取锁的实例能够完成特定的操作. 目前比较常 ...

  5. 继续封装DBDA.php 加入ajax

    <?php class DBDA { public $host = "localhost"; //服务器地址 public $uid = "root"; ...

  6. 【BZOJ3771】Triple 生成函数+FFT

    [BZOJ3771]Triple Description 我们讲一个悲伤的故事. 从前有一个贫穷的樵夫在河边砍柴. 这时候河里出现了一个水神,夺过了他的斧头,说: “这把斧头,是不是你的?” 樵夫一看 ...

  7. Delphi String的散漫记录,真是知识无数,陷阱无数

    真是膜拜Delphi C++ Builder编译器的作者们,要下多少苦功夫才能解决如此之多的问题,制造出一个神级作品给世人享用.另外以我的编程经验所能想到很麻烦但却是必须的还有两个地方,一个是Form ...

  8. 题解 P1387 【最大正方形】

    传送门 搞不清楚为什么这一题要DP . . . . . . 思路: \(n\le100\),考虑暴力. 要求一大块区间内都是1,考虑前缀和. 在矩阵中求一个符合条件的子矩阵,考虑\(n^3\)的&qu ...

  9. Android进程的生命周期

    Android系统想要永久的保留一个应用进程差点儿是不可能的.所以系统就须要不断的释放老的或者不太重要的进程以便腾出足够的内存空间来执行新的或者更重要的进程,那么系统怎样决定哪个进程应该保留哪个应该杀 ...

  10. PHP通过session id 实现session共享和登录验证的代码

    先说说,这个机制的用途吧,到现在为止战地知道这个机制有两个方面的用途: 首先,多服务器共享session问题,这个大家应该都能够理解的,当一个网站的用户量过大,就会使用服务器集群,例如专门有一个登录用 ...