洛谷 [P2575] 高手过招
SG函数+状压记忆化搜索
观察题目发现,每一行都是独立的,只要处理出来每一行的SG值,异或起来就好
每一行的SG值可以用状压+记忆化搜索的方法来求,对位运算技术是个很大的考验
注意SG值要预处理出来,不能每次算
(WA的原因是 a数组在递归的过程中没有被清空,而是直接覆盖了,如果动态开数组就没有这样的问题)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
using namespace std;
const int MAXN = 1100005;
int init() {int rv = 0, fh = 1; char c = getchar();while(c < '0' || c > '9') {if(c == '-') fh = -1;c = getchar();}while(c >= '0' && c <= '9') {rv = (rv<<1) + (rv<<3) + c - '0';c = getchar();}return fh * rv;
}
int T, n, SG[MAXN], a[30];
int lowbit(int x) {return x & (-x);//与树状数组中相同,取一个二进制数最右边的1
}
int SG_search(int cur) {if(SG[cur] != -1) return SG[cur];int t = cur + 1 - lowbit(cur + 1), k = lowbit(t), cnt = 0, tmp;//t 是 cur 去掉最后的所有1while(k) {t ^= k;tmp = k;for( ; (cur ^ k) < cur ; k >>= 1) ;a[cnt++] = SG_search(cur ^ k ^ tmp);k = lowbit(t);}sort(a, a + cnt);if(a[0]) return SG[cur] = 0;for(int i = 1 ; i < cnt ; i++) {if(a[i] - a[i - 1] > 1) return SG[cur] = a[i - 1] + 1;}return SG[cur] = a[cnt - 1] + 1;
}
int main() {freopen("in.txt", "r", stdin);T = init();memset(SG, -1, sizeof(SG));int a = 0;for(int i = 0 ; i < 20 ; i++) {a |= (1<<i);SG[a] = 0;}for(int i = 1 ; i <= (1<<20) ; i++) {if(SG[i] == -1) SG_search(i);}while(T--) {n = init();int ans = 0;for(int i = 1 ; i <= n ; i++) {int t = init();int temp = 0;for(int j = 1 ; j <= t ; j++) {int k = init();temp = temp | (1 << (20 - k));}ans ^= SG[temp];}if(ans) printf("YES\n");else printf("NO\n");}fclose(stdin);return 0;
}
转载于:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8479531.html
洛谷 [P2575] 高手过招相关推荐
- 洛谷 P2575 高手过招
题目描述 AKN玩游戏玩累了,于是他开始和同伴下棋了,玩的是跳棋!对手是wwx!这两位上古神遇在一起下棋,使得棋局变得玄幻莫测,高手过招,必有一赢,他们都将用最佳策略下棋,现在给你一个n*20的棋盘, ...
- 洛谷P2575 高手过招
题目 题意: n*20的棋盘中有一些棋子,两人每次移动一个棋子,若该棋子右边有空位,就向右跳到第一个空格,若没有,则不能移动.若所有棋子都不能移动,就算输.问先手能不能胜 题解: 我们将一行棋盘看成一 ...
- P2575 高手过招
P2575 高手过招 题意: AKN玩游戏玩累了,于是他开始和同伴下棋了,玩的是跳棋!对手是wwx!这两位上古神遇在一起下棋,使得棋局变得玄幻莫测,高手过招,必有一赢,他们都将用最佳策略下棋,现在给你 ...
- 洛谷 P1294 高手去散步
P1294 高手去散步 题目背景 高手最近谈恋爱了.不过是单相思."即使是单相思,也是完整的爱情",高手从未放弃对它的追求.今天,这个阳光明媚的早晨,太阳从西边缓缓升起.于是它找到 ...
- 洛谷 P1294 高手去散步-邻接矩阵+dfs-求无向图的一条最长路径
输入: 4 6 1 2 10 2 3 20 3 4 30 4 1 40 1 3 50 2 4 60 输出: 150 邻接矩阵: 代码如下: #include <iostream> usin ...
- 洛谷P1294 高手去散步
图的dfs,第一次dfs图,特此记录 代码 #include <bits/stdc++.h> using namespace std; int G[100][100],bk[100],an ...
- P2575 高手过招 (博弈、sg函数)
题目链接 题面: 题解: 用sg函数把所有的状态打出来就好啦. 代码: #include<iostream> #include<cstdio> #include<cstr ...
- P2575 高手过招(博弈)
题目大意: 有一个n*20的棋盘,上面有若干棋子 对于一个棋子,能将它向右移动一格,如果右边有棋子,则向右跳到第一个空格,如果右边没有空格,则不能移动这个棋子,如果所有棋子都不能移动,那么将输掉这场比 ...
- Luogu P2575 高手过招
题目链接 \(Click\) \(Here\) 关键在于转换成阶梯\(Nim\)的模型.最开始把题目看错了,理解正确后发现棋子可以向后跳不止一位,那么就比较简单了. 这里把空格看做阶梯,棋子看做硬币, ...
最新文章
- python 去除str的引号 去除括号_Python基础教程:运算符以及数据类型解析
- 首个64层3D NAND闪存技术出现
- Master/Slave知识
- Time to First Byte(TTFB)与Web性能优化
- S/4HANA业务角色概览之订单到收款篇
- Spring 3 RESTful Web服务
- PyPyODBC 0.9.2发布 - 纯Python实现的pyodbc替代库
- 2018.09.19python学习第七天part1
- 使用TensorFlow.js进行人脸触摸检测第1部分:将实时网络摄像头数据与深度学习配合使用
- bzoj 4950: [Wf2017]Mission Improbable(二分匹配)
- [转载] Python 字典(Dictionary) get()方法
- react 子组件向父组件传值
- 我没有时间 I Don't Have Time?
- 《编程回忆录》之 Unity3D 视频教程
- 苹果mp3软件_【APP】coolhear 3D:安卓+苹果
- cmd命令窗口快捷键与小技巧
- Python制作卡点视频
- 利用jdk使用WebService
- 盛华软件工作室 -开张了
- linux设置共享文件夹和删除共享文件夹(vmware:linux-windows共享文件夹)
热门文章
- megacli在线raid构建详解
- TestLink报错之:TestLink:::致命错误
- 在word中插入代码块
- Ubuntu 立即更新网卡配置,重启网卡
- 如何让div盒子或文字居中显示
- jeecg-boot字典翻译改造(支持实体类详情查询自动翻译)
- Mac Intellij Idea 代码自动提示快捷键
- 树莓派开机要按enter键问题
- 广州女大学生价值观调查:近六成愿嫁“富二代”
- 如何在$PATH中添加目录(/usr/local/bin)