BZOJ1188 [HNOI2007]分裂游戏(SG函数)
来源:互联网 发布:顶速网络机顶盒 编辑:程序博客网 时间:2024/06/05 06:04
传送门
拿到这道题就知道是典型的博弈论,但是却不知道怎么设计它的SG函数。看了解析一类组合游戏这篇论文之后才知道这道题应该怎么做。
这道题需要奇特的模型转换。即把每一个石子当做一堆石子,且原来在第i堆的石子(从0开始标号)的石子个数为n-i-1,这样题目就转化成了每次取一堆石子,并放回两个比这一堆的石子个数少的石堆。这样,我们就可以有序的递推sg函数值了。
即:
其中
#include <cstdio>#define MAXN 25int sg[MAXN], n, a[MAXN];bool used[MAXN];void init() { for(int i = 1; i < MAXN; ++ i) { for(int j = 0; j < MAXN; ++ j)used[j] = 0; for(int j = 0; j < i; ++ j) for(int k = 0; k <= j; ++ k) used[sg[j]^sg[k]] = 1; for(int j = 0; j < MAXN; ++ j) if(!used[j]) { sg[i] = j; break; } }}int main() { init(); int T; scanf("%d", &T); while(T --) { scanf("%d", &n); int ans = 0, cnt = 0; for(int i = 0; i < n; ++ i) { scanf("%d", &a[i]); if(a[i] & 1) ans ^= sg[n-i-1]; } for(int i = 0; i < n; ++ i) { if(!a[i]) continue; for(int j = i+1; j < n; ++ j) { if(!a[j]) continue; for(int k = j; k < n; ++ k) { if(!a[k]) continue; if((ans ^ sg[n-i-1] ^ sg[n-j-1] ^ sg[n-k-1]) == 0) { if(!cnt) printf("%d %d %d\n", i, j, k); ++ cnt; } } } } if(!cnt) puts("-1 -1 -1"); printf("%d\n", cnt); } return 0;}
0 0
- BZOJ1188 [HNOI2007]分裂游戏(SG函数)
- 【SG函数】BZOJ1188(HNOI2007)[分裂游戏]题解
- [SG函数] BZOJ1188: [HNOI2007]分裂游戏
- [BZOJ1188][HNOI2007]分裂游戏(博弈SG函数)
- BZOJ1188 [HNOI2007]分裂游戏(SG定理)
- bzoj1188: [HNOI2007]分裂游戏
- [BZOJ1188][HNOI2007]分裂游戏
- bzoj1188 [HNOI2007]分裂游戏
- bzoj1188: [HNOI2007]分裂游戏
- bzoj1188[HNOI2007]分裂游戏
- bzoj1188 [HNOI2007]分裂游戏
- BZOJ 1188 [HNOI2007]分裂游戏 SG函数
- bzoj 1188: [HNOI2007]分裂游戏 sg函数
- BZOJ1188: [HNOI2007]分裂游戏(洛谷P3185)
- bzoj 1188: [HNOI2007]分裂游戏(sg函数)
- bzoj1188 分裂游戏 博弈论
- 【BZOJ1188】分裂游戏,博弈
- 1188: [HNOI2007]分裂游戏
- 在虚拟机间 NFV 应用上使用采用 DPDK 的 Open vSwitch*
- 我的java并发编程学习笔记
- 硬件之SPI时序
- 单点最短路径算法 bellman-ford模板和队列优化后的spfa算法模板
- UIScrollView
- BZOJ1188 [HNOI2007]分裂游戏(SG函数)
- U3D实验系列之深度测试一(in unity5.2.2)
- 支持多客户端的spring+memcached
- 第13课 spark内核架构解密学习笔记
- JDK和SDK和ADT的简介
- Linux五种IO模型
- Android Studio 使用JNI入门
- SESSION 页面刷新 失效
- jdbcTemplate返回插入ID