题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1536

题意:首先输入K 表示一个集合的大小  之后输入集合 表示对于这对石子只能去这个集合中的元素的个数

之后输入 一个m 表示接下来对于这个集合要进行m次询问

之后m行 每行输入一个n 表示有n个堆  每堆有n1个石子  问这一行所表示的状态是赢还是输 如果赢输入W否则L

思路:sg函数

一开始直接打表tle了,因该是多组输入的原因吧

然后我们再仔细考虑一下这个m,m<=100,一般来说,给的数据不可能每组的max(a[i]) (1<=i<=m)都达到1e4;

所以我们可以不必每次打表都打到1e4,我们可以通过dfs针对具体数据打表;这样就不会tle啦;

代码:

 #include <iostream>
#include <string.h>
#include <algorithm>
#define MAXN 200010
using namespace std; int f[MAXN], sg[MAXN], n; int dfs_sg(int x){//sg函数
if(sg[x]!=-){//之前已经计算过
return sg[x];
}
int vis[];
memset(vis, , sizeof(vis));
for(int i=; i<n; i++){//找到当前节点能到达的点
if(f[i]<=x){
dfs_sg(x-f[i]);
vis[sg[x-f[i]]]=;
}
}
for(int i=; ; i++){//求mex函数
if(!vis[i]){
sg[x]=i;
return sg[x];
}
}
} int main(void){
std::ios::sync_with_stdio(false), cin.tie(), cout.tie();
while(cin >> n){
if(n==){
break;
}
memset(sg, -, sizeof(sg));
for(int i=; i<n; i++){
cin >> f[i];
}
sort(f, f+n);
int k, t, x;
cin >> k;
while(k--){
cin >> t;
int ans=;
for(int i=; i<t; i++){
cin >> x;
ans^=dfs_sg(x);
}
if(ans==){
cout << "L";
}else{
cout << "W";
}
}
cout << endl;
}
return ;
}

最新文章

  1. Firebug中调试中的js脚本中中文内容显示为乱码
  2. Fragment之间传值
  3. js日期格式化函数
  4. details和summary
  5. ITop
  6. Selenium2+python自动化4-Pycharm使用
  7. ASP.NET MVC开发微信(二)
  8. ssm框架整合小结
  9. Zend Server安装后首次运行就出现Internal Server Error的解决(转)
  10. Java学习笔记--PriorityQueue(优先队列)(堆)
  11. [Swust OJ 179]--火柴棍(找规律)
  12. HDU 1532 最大流入门
  13. easyUI 添加排序到datagrid
  14. GBK和UTF8的区别
  15. postgresql添加字段
  16. PYTHON 格式字符串中的填充符
  17. ES 6 系列 - Proxy
  18. 【mmall】学习Spring要善用Spring的Github
  19. 【Shell】30分钟关闭Tcpdump,开启Tcpdump、检测目录大小终止任务
  20. 安装Inotify-tools

热门文章

  1. EasyDarwin流媒体云平台架构
  2. Extjs-树 Ext.tree.TreePanel 动态加载数据
  3. 九度OJ 1108:堆栈的使用 (堆栈)
  4. 从模版生成 uri Golang 的 html/template 包不太适合于这种情况
  5. 5 Maven生命周期和插件
  6. HZNU 2154 ldh发奖金【字符串】
  7. 在react里面使用jquery插件
  8. git命令行删除远程分支
  9. PYTHON 爬虫笔记三:Requests库的基本使用
  10. Java(一)——认识Java语言