BZOJ 3576 江南乐

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

 1 #include<algorithm>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<iostream>
 6 #define M 100100
 7 int T,F,n,sg[2000005],v[2000005],ans;
 8 int read(){
 9     int t=0,f=1;
10     char ch=getchar();
11     while (ch<‘0‘||ch>‘9‘) {if (ch==‘-‘) ch=-1;ch=getchar();}
12     while (‘0‘<=ch&&ch<=‘9‘){t=t*10+ch-‘0‘;ch=getchar();}
13     return t*f;
14 }
15 void init(){
16     for (int i=0;i<F;i++) sg[i]=0;
17     for (int i=F;i<=100000;i++){
18         for (int j=2,pos=0;j<=i;j=pos+1){
19             pos=i/(i/j);int k=i/j;
20             int nk1=i%j,nk=j-nk1;
21             v[sg[(nk&1)*(k)]^sg[(nk1&1)*(k+1)]]=i;
22             if (j+1<=std::min(pos,i)){
23                 nk1=i%(j+1),nk=j+1-nk1;
24                 v[sg[(nk&1)*(k)]^sg[(nk1&1)*(k+1)]]=i;
25             }
26         }
27         for (int j=0;;j++)
28          if (v[j]!=i){
29                 sg[i]=j;
30                 break;
31          }
32     }
33 }
34 int main(){
35     T=read();F=read();
36     init();
37     while (T--){
38         n=read();
39         ans=0;int x;
40         for (int i=1;i<=n;i++)
41          x=read(),ans^=sg[x];
42         if (!T) printf("%d\n",(!ans)?0:1);
43         else printf("%d ",(!ans)?0:1);
44     }
45 }
时间: 2024-08-02 08:47:34

BZOJ 3576 江南乐的相关文章

【BZOJ】3576: [Hnoi2014]江南乐

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3576 很显然,这是一个multi-nim游戏. 注意:1.一个点的SG值就是一个不等于它的后继点的SG的且大于等于零的最小整数.(mex) 2.主游戏的SG值等于所有子游戏的异或和 所以区分好主游戏和后继点的区别.   一开始多个石子堆组合起来形成了一个主游戏. 一个石子堆可以分为多个石子堆,每一种分发构成了一个主游戏,这些主游戏的异或和构成的当前这个点(状态)的SG函数.  显然有一个

bzoj 3576: [Hnoi2014]江南乐

Description 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏. 游戏的规则是这样的,首先给定一个数F,然后游戏系统会产生T组游戏.每一组游戏包含N堆石子,小A和他的对手轮流操作.每次操作时,操作者先选定一个不小于2的正整数M (M是操作者自行选定的,而且每次操作时可不一样),然后将任意一堆数量不小于F的石子分成M堆,并且满足这M堆石子中石子数最多的一堆至多比石子数最少的一堆多1(即分的尽量平均,事

【bzoj3576】 Hnoi2014—江南乐

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+

bzoj3576[Hnoi2014]江南乐

http://www.lydsy.com/JudgeOnline/problem.php?id=3576 SG函数 我们发现$\left \lfloor \frac{n}{i} \right \rfloor$只有$\sqrt{n}$个取值 不妨设$x=\left \lfloor \frac{n}{i} \right \rfloor$ 那么最终的分割方案一定是下面4种情况之一:偶数个$x$,偶数个$x+1$:偶数个$x$,奇数个$x+1$:奇数个$x$,偶数个$x+1$:奇数个$x$,奇数个$x+

YCB 的暑期计划

前言 YCB现在很弱(TAT) 暑假有一个月,赶快狂补一下. 大概的计划如下: 首先前期会以数据结构为主,毕竟代码能力太弱,涉及内容:线段树分治.二进制分组.KD-Tree. 等数据结构做到没有智商的时候加入一波数论,内容为 杜教筛.min_25筛. 然后中途小清新一下,做一些 组合博弈与构造题. 接着继续练代码能力,顺便学一些神奇的暴力:启发式合并.dsu on tree . 然后图论也忘的差不多了,就回过头去学点新东西,大概会有spfa判负环.0/1分数规划.差分约束. 估计这个时候也没有什

总结与心得(持续更新)

不知道为什么,刚学的算法过了2个月就忘得一干二净,我并没有背代码啊,当时学的时候还刷了好多题来着→_→,我是不是大脑能力严重衰退了. 动态规划 单调队列 一般情况下,${dp}$方程可以搞成这样:${f_i=f_j+t_j+t_i}$,只要其中没有变量同时与${i,j}$都有关,那么我们可以用单调队列来做,单调队列里面元素的关键字就是与${j}$有关的东西${f_j+t_j}$.example:生产产品 有些比较特殊的,虽然存在同时与${i,j}$相关的函数,但是这个函数比较简单,使得已经存在在

HNOI 2014

D1T1:画框 frame 题意:给你两个n阶正整数方阵,请你求最大的\( \sum_{i = 1}^{n} A_{i, p_i}\times \sum_{i = 1}^{n} B_{i, p_i}  \)其中\({p_i}\)是一个n的排列.\(n \le 70\). 如果A=B,这就是一个二分图最大完美匹配问题,那么我们可以用费用流或者KM算法解决,然而A却可以不等于B,我们需要另辟蹊径. 当年我看到这道题就只会随机化乱搞,现在看来,如果仔细的思考还是可以搞出来的. 想到,我们可以求出对于A

专题总结(博弈论)

https://zybuluo.com/ysner/note/1232112 双人平等博弈(理论应用前提) 信息完全公开 双方轮流行动 面对同一局面,双方的决策集合相同 一般来说,规定不能操作者输 游戏局面不会成环,有限步之后游戏必定结束 \(N\)态与\(P\)态 首先把结束的局面置为\(P\)态 对于一个\(P\)态,找到所有能转移到它的状态,它们全部是\(N\)态 搜到一个状态时,它还没有被筛掉,就是\(P\)态 很多题目中, P 态之间不可直接转移. 一些性质 \(SG\)值异或和为\(

bzoj 4177 Mike的农场

bzoj 4177 Mike的农场 思维有些江化了,一上来就想费用流做法,但其实就是个最小割啊. 考虑先将所有的收益拿到,再减去不能拿的以及三元组 \((i,j,k)\) 产生的代价.即,先让 \(ans=\sum a_i+b_i+\sum_{(S,a,b)} b\). 然后要让减去的最小,尝试构造一个最小割模型.建一个源点 \(S\) ,一个汇点 \(T\) . 为了满足每个点只能选一种动物,从 \(S\) 向每个点 \(i\) 连权值为 \(a_i\) 的边,从每个点 \(i\) 向 \(T