BZOJ-3576 江南乐 博弈+优化】的更多相关文章

fye测试原题,高一全跪,高二学长除了CA爷似乎都A辣(逃) 3576: [Hnoi2014]江南乐 Time Limit: 30 Sec Memory Limit: 512 MB Submit: 1099 Solved: 408 [Submit][Status][Discuss] Description 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏. 游戏的规则是这样的,首先给定一个数F,然后游戏系统会…
http://www.lydsy.com/JudgeOnline/problem.php?id=3576 思路:由于数字巨大,因此N^2异或做法是过不了的,我们考虑将n个石子分成i堆,那么会有n%i堆n/i+1的石子,i-n%i堆n/i的石子.如果两个堆的石子数相同,那么他们异或起来就为0,因此,这两种石子堆,我们可以看做:每种至多只有1堆.这样就可以枚举n/i,然后可以避免计算很多重复的部分,时间复杂度为N^1.5 #include<algorithm> #include<cstdio…
3576: [Hnoi2014]江南乐 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1929  Solved: 686[Submit][Status][Discuss] Description 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏. 游戏的规则是这样的,首先给定一个数F,然后游戏系统会产生T组游戏.每一组游戏包含N堆石子,小A和他的对手轮流操作.…
[BZOJ3576]江南乐(博弈论) 题面 BZOJ 洛谷 题解 无论一堆石头怎么拆分,都并不能改变它是一个\(Multi-SG\)的事实. 既然每一组的\(F\)都是固定的,那么我们预处理所有的可能的堆,而将石子拆分成若干堆,也只需要考虑\(SG\)函数的值就好了. 但是这样子求\(SG\)值的复杂度是\(O(V^2)\)的,其中\(V\)是值域,也就是\(10^5\). 再分析一下,将\(x\)个式子拆分成的最少的石子个数是\([x/m]\),最多的情况是\([x/m+1]\), 因为\([…
P3235 [HNOI2014]江南乐 Description 两人进行 T 轮游戏,给定参数 F ,每轮给出 N 堆石子,先手和后手轮流选择石子数大于等于 F 的一堆,将其分成任意(大于1)堆,使得这些堆中石子数最多的和最少的相差不超过1(即尽量均分).求先手和后手谁必胜. Input 输入第一行包含两个正整数T和F,分别表示游戏组数与给定的数. 接下来T行,每行第一个数N表示该组游戏初始状态下有多少堆石子.之后N个正整数,表示这N堆石子分别有多少个. Output 输出一行,包含T个用空格隔…
LOJ#2210. 「HNOI2014」江南乐 感觉是要推sg函数 发现\(\lfloor \frac{N}{i}\rfloor\)只有\(O(\sqrt{N})\)种取值 考虑把这些取值都拿出来,能取到这个值的\(i\)是一个区间\([l,r]\) 如果\(r - l + 1 = 1\),那么直接算这个数的答案即可(\(\lfloor \frac{N}{i}\rfloor\)的石子有奇数堆还是偶数堆,\(\lfloor \frac{N}{i}\rfloor + 1\)的石子有奇数堆还是偶数堆,…
[BZOJ 1767] [Ceoi2009] harbingers (斜率优化) 题面 给定一颗树,树中每个结点有一个邮递员,每个邮递员要沿着唯一的路径走向capital(1号结点),每到一个城市他可以有两种选择: 1.继续走到下个城市 2.让这个城市的邮递员替他出发 每个邮递员出发需要一个准备时间W[I],他们的速度是V[I],表示走一公里需要多少分钟. 现在要你求出每个城市的邮递员到capital的最少时间(不一定是他自己到capital,可以是别人帮他) 分析 dp方程很好推,设dp[x]…
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3576 很显然,这是一个multi-nim游戏. 注意:1.一个点的SG值就是一个不等于它的后继点的SG的且大于等于零的最小整数.(mex) 2.主游戏的SG值等于所有子游戏的异或和 所以区分好主游戏和后继点的区别.   一开始多个石子堆组合起来形成了一个主游戏. 一个石子堆可以分为多个石子堆,每一种分发构成了一个主游戏,这些主游戏的异或和构成的当前这个点(状态)的SG函数.  显然有一个…
Description 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏. 游戏的规则是这样的,首先给定一个数F,然后游戏系统会产生T组游戏.每一组游戏包含N堆石子,小A和他的对手轮流操作.每次操作时,操作者先选定一个不小于2的正整数M (M是操作者自行选定的,而且每次操作时可不一样),然后将任意一堆数量不小于F的石子分成M堆,并且满足这M堆石子中石子数最多的一堆至多比石子数最少的一堆多1(即分的尽量平均,事…
这个东西卡常--预处理的时候要先把i%j,i/j都用变量表示,还要把%2变成&1-- 首先每一堆都是不相关子游戏,所以对于每一堆求sg即可 考虑暴力枚举石子数i,分割块数j,分解成子问题求xor和(其实就是根据i/j,i/j+1的个数的奇偶性xor一下即可),然后对sg[i]暴力mex,这样是n^2的 考虑优化,注意到一共只有根号级别的i/j,所以根据这个分块,上面的xor和是跟距个数奇偶性,而同样i/j的奇偶性只有两种(因为总个数相同),也就是i%j和i%(j+2),j-(i%j)和(j+2)…
题意 有nnn堆石子,给定FFF,每次操作可以把一堆石子数不小于FFF的石子平均分配成若干堆(堆数>1>1>1). 平均分配即指分出来的石子数中最大值减最小值不超过111.不能进行操作就算输.询问先手是否有必胜策略. 分析 因为每一推石子实际上是独立的.于是就可以求出每一堆石子的SGSGSG函数后再异或起来. 于是看看怎么求SG(N)SG(N)SG(N).方法是枚举分成的堆数iii.因为最大−-−最小<=1<=1<=1,那么只可能有两种取值.设: 分出来的较小值为rrr…
Description 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏.    游戏的规则是这样的,首先给定一个数F,然后游戏系统会产生T组游戏.每一组游戏包含N堆石子,小A和他的对手轮流操作.每次操作时,操作者先选定一个不小于2的正整数M (M是操作者自行选定的,而且每次操作时可不一样),然后将任意一堆数量不小于F的石子分成M堆,并且满足这M堆石子中石子数最多的一堆至多比石子数最少的一堆多1(即分的尽量平…
L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天,L公司的总裁L先生接到气象部门的电话,被告知三天之后将有一场暴雨,于是L先生决定紧急在某些工厂建立一些仓库以免产品被淋坏.由于地形的不同,在不同工厂建立仓库的费用可能是不同的.第i个工厂目前已有成品Pi件,在第i个工厂位置建立仓库的费用是Ci.对于没有建立仓库的工厂,其产品应被运往其他的仓库进行储藏,而由于L公司产品的对外…
题目描述 两人进行 $T$ 轮游戏,给定参数 $F$ ,每轮给出 $N$ 堆石子,先手和后手轮流选择石子数大于等于 $F$ 的一堆,将其分成任意(大于1)堆,使得这些堆中石子数最多的和最少的相差不超过1(即尽量均分).求先手和后手谁必胜. 输入 输入第一行包含两个正整数T和F,分别表示游戏组数与给定的数.接下来T行,每行第一个数N表示该组游戏初始状态下有多少堆石子.之后N个正整数,表示这N堆石子分别有多少个. 输出 输出一行,包含T个用空格隔开的0或1的数,其中0代表此时小A(后手)会胜利,而1…
题面 BZOJ传送门(中文题面但是权限题) HDU传送门(英文题面) 分析 定义f[i]f[i]f[i]表示在iii时间(离散化之后)卖出手上的机器的最大收益.转移方程式比较好写f[i]=max{f[j]−p[j]+r[j]+(d[i]−d[j]−1)∗g[j]}f[i]=max\{f[j]-p[j]+r[j]+(d[i]-d[j]-1)*g[j]\}f[i]=max{f[j]−p[j]+r[j]+(d[i]−d[j]−1)∗g[j]} 显然可以斜率优化,移项之后得到(f[j]−p[j]+r[j…
dp(i)表示处理完[i,n]且i是放守卫塔的最小费用. dp(i) = min{dp(j) + (j-i)(j-i-1)/2}+costi(i<j≤N) 然后斜率优化 ----------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm>   using namespace std;   typedef l…
4518: [Sdoi2016]征途 题意:\(n\le 3000\)个数分成m组,一组的和为一个数,求最小方差\(*m^2\) DP方程随便写\(f[i][j]=min\{f[k][j-1]+(s[i]-s[k])^2 \}\) 发现可以斜率优化,很久没写忘记了60分暴力走人 拆开平方,\(f[i][p]=-2s_i s_k + f[k][p-1] + s_k^2 - s_i^2\) 对于两个转移\(j,k\),j比k优时\[ slope(j,k)=\frac{f[j]+s_j^2-f[k]-…
题目描述 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏. 游戏的规则是这样的,首先给定一个数F,然后游戏系统会产生T组游戏.每一组游戏包含N堆石子,小A和他的对手轮流操作.每次操作时,操作者先选定一个不小于2的正整数M (M是操作者自行选定的,而且每次操作时可不一样),然后将任意一堆数量不小于F的石子分成M堆,并且满足这M堆石子中石子数最多的一堆至多比石子数最少的一堆多1(即分的尽量平均,事实上按照这样的…
新知识get. 一类博弈问题,基于以下条件: 1.博弈者人数为两人,双方轮流进行决策.2.博弈状态(对应点)可分为两类(状态空间可分为两个集合),对应二分图两边(X集和Y集).任意合法的决策(对应边)使状态从一类跳转到另一类.(正是由于这个性质使得问题可以用二分图描述)3.不可以转移至已访问的状态.(不可重复访问点)4.无法转移者判负. 这类问题相当于从二分图指定起点开始轮流移动,不可重复访问点,无法移动判负 . 现在问题变为从二分图指定起点开始轮流移动,不可重复访问点,无法移动判负.不妨设起点…
传送门 这题又是我什么时候做的(挠头) 首先是个和SG函数有关的博弈论,SG=0则先手必败.显然一堆石子就是一个游戏,而若干堆石子的SG值就是每堆SG的异或和,所以算出每堆石子SG就能知道答案 然后怎么求SG,根据定义,一个局面SG是后继局面SG的\(mex\),我们枚举某堆石子(有x个)分成多少堆i,然后能知道有若干堆石子有\(\lfloor\frac{x}{i}\rfloor\)个,还有的有\(\lceil\frac{x}{i}\rceil\)个.然后这两种石子的堆数也可以算出来,又因为异或…
http://www.lydsy.com/JudgeOnline/problem.php?id=3576 (题目链接) 题意 给出一个数$F$,然后$n$堆石子,每次操作可以把一堆不少于$F$的石子分成$m$堆,$m$是玩家任选的不少于$2$的正整数,这$m$堆石子中最多的一堆与最少的一堆之差不超过$1$,问是否存在先手必胜. Solution 对每一个子游戏考虑如何求解$SG$函数. 假设当前一堆中有$i$石子,我们想把它分成$j$堆,那么石子数为$k=\lfloor{i/j}\rfloor+…
1563: [NOI2009]诗人小G Time Limit: 100 Sec  Memory Limit: 64 MBSubmit: 2611  Solved: 840 Description Input Output 对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超过1018,则输出"Too hard to arrange"(不包含引号).每个输出后面加"--------------------" Sample Inpu…
题面 题面 题解 首先我们知道一个关于除法的重要性质:对于一个固定的\(i\),表达式\(\frac{i}{m}\)的取值只有根号个. 因此我们考虑如何优化SG函数的求解. 观察到在取值相同的同一段中,分完之后只会有m堆取值为x 或者x + 1的石子. 因此我们不需要知道每种取值的石子具体有多少,我们只需要知道它们的堆数是奇是偶即可. 同时我们知道,在同一段中,如果m变化1,那么会产生的结果就是有x堆取值为x + 1的石堆变为取值为x,并且新增一堆取值为x的石堆. 我们稍作分析: 如果x是奇数.…
Portal -->bzoj3567 Solution ​  今天开始啃博弈论了qwq ​  先mark一篇很棒的博客Portal -->博弈论学习资料 ​​  稍微总结一下两个自己容易混淆的点: 1.有一类博弈论问题的主要步骤是首先将原游戏拆分成若干个独立的子游戏,然后原游戏的\(sg\)就是子游戏\(sg\)值的异或和 2.有向图游戏中,对于一个局面,它的\(sg\)是其后继局面的\(sg\)值的\(mex\) ​   ​​  这题的话,首先想怎么拆分 ​​  不难发现每一堆的操作其实是独…
思路:很容易写出dp方程,很容易看出能用单调队列优化.. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PII pair<int, int> #define y1 skldjfskldjg #define y2 skldfjsklejg using namespace std; + ; const int inf…
思路:我打了半天的表找规律....  我们将每两个数的差值看成一堆堆石子,那么题目实际上就变为了 从当前堆可以拿出一些石子放到下一堆里去,就变成了一个阶梯博弈... #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define pii pair<int,int> #define piii pair<int, pair<…
如果有一块土地的长和宽都小于另一块土地的长和宽,显然这块土地属于“赠送土地”. 我们可以排序一下将这些赠送土地全部忽略掉,一定不会影响到答案. 那么剩下的土地就是长递减,宽递增的.令dp[i]表示购买前i个土地的最小代价. 显然有dp[i]=min(dp[j]+ku[i]*ch[j+1]).(j<i). 其中ku[i]表示第i个土地的宽,ch[i]表示第i个土地的长. 这个式子得用斜率优化一下.很normal,推出式子就解决了. # include <cstdio> # include…
挺好的题 我们算出每个数的sg值后异或起来即可 对于$n$,我们要求$sg_n$ 朴素的想法是枚举把$n$个石子分成$m$堆,有$m-n\%m$堆大小为$\left\lfloor\frac nm\right\rfloor$的石子,有$n\%m$堆大小为$\left\lfloor\frac nm\right\rfloor+1$的石子,因为是异或所以只有奇数堆的石子对$sg_n$有贡献,直接算出来再求mex即可 考虑优化,暴力是枚举$2\leq m\leq n$,因为当$\left\lfloor\f…
Description 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏. 游戏的规则是这样的,首先给定一个数F,然后游戏系统会产生T组游戏.每一组游戏包含N堆石子,小A和他的对手轮流操作.每次操作时,操作者先选定一个不小于2的正整数M (M是操作者自行选定的,而且每次操作时可不一样),然后将任意一堆数量不小于F的石子分成M堆,并且满足这M堆石子中石子数最多的一堆至多比石子数最少的一堆多1(即分的尽量平均,事…
$ \color{#0066ff}{ 题目描述 }$ 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏. 游戏的规则是这样的,首先给定一个数F,然后游戏系统会产生T组游戏.每一组游戏包含N堆石子,小A和他的对手轮流操作.每次操作时,操作者先选定一个不小于2的正整数M (M是操作者自行选定的,而且每次操作时可不一样),然后将任意一堆数量不小于F的石子分成M堆,并且满足这M堆石子中石子数最多的一堆至多比石子数最少…