[SG函数 + 分块] BZOJ4035: [HAOI2015]数组游戏
来源:互联网 发布:python调用exe程序 编辑:程序博客网 时间:2024/05/18 03:36
博弈好题。这种博弈的01取反的模型可以把白色看做有奇数个石子,黑色看做偶数个,因为同一位置偶数个石子SG值异或会抵消…..
这么理解的话,可以把一个石子,即一个白块看做一个独立的游戏。
现在只需求SG值。
一般SG函数的题可以先打表找规律,发现连续
有了这个性质就很简单了,暴力枚举块,枚举后继状态时连续的一段可以
#include<cstdio>#include<cmath>#include<algorithm>using namespace std;const int maxn=500005;int n,Q,ans,b[maxn],c[2][maxn],vis[maxn],clk,sqrt_n;inline int getSG(int x){ x=n/(n/x); if(x<=sqrt_n) return c[0][x]; else return c[1][n/x];}void Solve(){ for(int i=1;i<=n;i=n/(n/i)+1) b[++b[0]]=n/(n/i); for(int i=b[0];i>=1;i--){ int x=b[i],now=0; clk++; vis[0]=clk; for(int j=x+x;j<=n;){ int t=(n/(n/j))/x*x, cnt=(t-j)/x+1; vis[now^getSG(j)]=clk; if(cnt&1) now^=getSG(j); j=t+x; } int res=0; while(vis[res]==clk) res++; if(x<=sqrt_n) c[0][x]=res; else c[1][n/x]=res; }}int main(){ freopen("bzoj4035.in","r",stdin); freopen("bzoj4035.out","w",stdout); scanf("%d",&n); sqrt_n=sqrt(n)+1; Solve(); scanf("%d",&Q); while(Q--){ int t,x; scanf("%d",&t); ans=0; while(t--) scanf("%d",&x), ans^=getSG(x); if(ans) puts("Yes"); else puts("No"); } return 0;}
阅读全文
0 0
- [SG函数 + 分块] BZOJ4035: [HAOI2015]数组游戏
- 【BZOJ4035】数组游戏,博弈论+分块乱搞
- [bzoj4035]数组游戏
- bzoj4035: [HAOI2015]T3
- bzoj 4035: [HAOI2015]T3 SG函数
- BZOJ 4035 [HAOI2015]数组游戏
- NIM游戏&SG函数
- 石子游戏 (SG函数)
- 组合游戏 - SG函数和SG定理
- 组合游戏 - SG函数和SG定理
- nim游戏/sg函数(博弈论)
- nim游戏/sg函数(博弈论)
- Nim游戏和SG函数
- Nim游戏和sg函数
- nim游戏/sg函数(博弈论)
- Nim游戏和SG函数
- 组合游戏中的SG函数
- Nim 游戏和 SG 函数
- VS2012 格式化(自动对齐)快捷键
- 如何选择第一个开源项目
- 2017年赛季总结
- jquery中this与$(this)的用法区别.和于js中的this区别
- 代理模式-《Head First 设计模式》
- [SG函数 + 分块] BZOJ4035: [HAOI2015]数组游戏
- DNS解析过程
- PAT考试乙级1050(C语言实现) (重点题目)(memset以及思路)
- NuttX用户手册阅读记录2
- Q版缓冲区溢出教程-第一章读书笔记
- HDOJ 2186 悼念512汶川大地震遇难同胞——一定要记住我爱你(水题)
- Vue2.5.9源码解读(2) — build/config.js
- ERROR:Pack:2860
- Linux下redis-cluster单机集群安装方法