题目链接:UOJ - 51

据说这题与 CF 39E 类似。

题目分析

一看题目描述,啊,博弈论,不会!等待爆零吧...

这时,XCJ神犇拯救了我,他说,这题可以直接搜啊。

注意!是用记忆化搜索,状态为 (a, b) 。

是这样的:我们从后面倒着推,对于一个无法再增加 a 或 b 的 (a, b) 状态,当前走的人必败。这是终止的状态。

而对于一个不是终止状态的状态 (a, b) ,可能有两种后继状态 (a + 1, b) || (a, b + 1) ,我们递归先求出这两个后继状态是必败还是必胜。

如果两个后继状态中有一个是必败的,那么就存在走法使得下一个走的人必败,那么一定会走那个状态(因为所有人都足够聪明),当前状态就是必胜的。

否则,无论怎么选择,下一个走的人都必胜,那么当前状态就是必败的。

注意,如果某一个后继状态不合法,那么就当作一个必胜状态吧,因为当前不能那样走。

需要注意的是,当 b = 1,合法的 a 有 n 个,是不能搜完也不能存储的,我们把 b = 1 的状态分为两类:

1) a <= sqrt(n) 这种状态下,b 可能会增加, 所以和别的状态一样处理。

2) a > sqrt(n) 这样的状态,b是不能增加的,直接看 n - a 的奇偶就好了。每次用到这种状态的时候就单独做一下。

这样能求出所有可行状态的必胜或必败属性,由于对于每个 b ,可行 a 的个数差别过大,我们对每个 b 用一个 vector 存所有可行 a 的答案 (STL就是好!)。

对于每一个查询直接输出就好了。

特别注意的是!一定要记忆化搜索啊!不记忆化就TLE到爆啊!!状态重复搜了太多太多次啊!!

写代码时出现的错误:这样判断了后继状态 if (DFS(x + 1, y) && DFS(x, y + 1)) 这样是万万不可以的!!后面的一个 DFS(x, y+1) 放在了&& 之后,只要前面的值为 true ,后面的这个 DFS 直接就不调用了!!就跪了!!

代码

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector> using namespace std; const int MaxN = 1000000 + 5; int n, m, a, b, SqrtN, Top; vector<int> E[35]; typedef long long LL; bool Pow(int a, int b) {
LL f, ret;
f = a; ret = 1ll;
while (b) {
if (b & 1) {
ret *= f;
if (ret > n) return true;
}
b >>= 1;
f *= f;
}
if (ret > n) return true;
return false;
} bool DFS(int x, int y) {
if (y != 1 && (int)E[y].size() > x && E[y][x] != 0) return (E[y][x] == 1);
if (Pow(x, y)) return true;
if (y == 1 && x > SqrtN) {
if ((n - x) & 1) return true;
else return false;
}
bool Flag1, Flag2;
Flag1 = DFS(x + 1, y);
Flag2 = DFS(x, y + 1);
while ((int)E[y].size() <= x) E[y].push_back(0);
if (Flag1 && Flag2) {
E[y][x] = -1;
return false;
}
else {
E[y][x] = 1;
return true;
}
} bool WillWin(int x, int y) {
if (y == 1 && x > SqrtN) {
if ((n - x) & 1) return true;
else return false;
}
return (E[y][x] == 1);
} int main()
{
scanf("%d%d", &n, &m);
SqrtN = (int)sqrt(n * 1.0);
DFS(2, 1);
for (int i = 1; i <= m; ++i) {
scanf("%d%d", &a, &b);
if (WillWin(a, b)) printf("Yes\n");
else printf("No\n");
}
return 0;
}

  

[UOJ Round#4 A] [#51] 元旦三侠的游戏 【容斥 + 递推】的更多相关文章

  1. 【UOJ#51】【UR #4】元旦三侠的游戏(博弈论)

    [UOJ#51][UR #4]元旦三侠的游戏(博弈论) 题面 UOJ 题解 考虑暴力,\(sg[a][b]\)记录\(sg\)函数值,显然可以从\(sg[a+1][b]\)和\(sg[a][b+1]\ ...

  2. 【uoj#51】[UR #4]元旦三侠的游戏 博弈论+dp

    题目描述 给出 $n$ 和 $m$ ,$m$ 次询问.每次询问给出 $a$ 和 $b$ ,两人轮流选择:将 $a$ 加一或者将 $b$ 加一,但必须保证 $a^b\le n$ ,无法操作者输,问先手是 ...

  3. [UOJ #51]【UR #4】元旦三侠的游戏

    题目大意:给$n$,一个游戏,给$a,b$,两个人,每人每次可以把$a$或$b$加一,要求$a^b\leqslant n$,无法操作人输.有$m$次询问,每次给你$a,b$,问先手可否必胜 题解:令$ ...

  4. 【UR #4】元旦三侠的游戏(博弈论+记忆化)

    http://uoj.ac/contest/6/problem/51 题意:给m($m \le 10^5$)个询问,每次给出$a, b(a^b \le n, n \le 10^9)$,对于每一组$a, ...

  5. A. 【UR #4】元旦三侠的游戏

    题解: 挺水的吧 会发现当b不等于1的时候,状态只有sigma i x^(1/i) 显然这东西很小.. 然后我们会发现每个点向两个点动 定义必胜点和必败点 当一个点有一条边连向必败点 那么它就是必胜点 ...

  6. uoj51 元旦三侠的游戏

    题意:询问a,b,n.每次可以a+1或b+1,保证a^b<=n,不能操作者输.问先手是否赢? n<=1e9. 标程: #include<cstdio> #include< ...

  7. [原]hdu2045 不容易系列三——LELE的RPG难题 (递推方程)

    本文出自:blog.csdn.net/svitter 原题:http://acm.hdu.edu.cn/showproblem.php?pid=2045 题意:中文不用我说了吧. 这个题目的关键就在于 ...

  8. Educational Codeforces Round 37 G. List Of Integers (二分,容斥定律,数论)

    G. List Of Integers time limit per test 5 seconds memory limit per test 256 megabytes input standard ...

  9. Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array(动态规划.递推)

    传送门 题意: 给你一个包含 n 个元素的序列 a[]: 定义序列 a[] 的 beauty 为序列 a[] 的连续区间的加和最大值,如果全为负数,则 beauty = 0: 例如: a[] = {1 ...

随机推荐

  1. Delphi 记事本 TMemo

    Windows记事本记事本     描述:     用Delphi模仿的Windows记事本 界面和功能都和Windows的记事本一样,是用Memo实现的而不是RichEdit 可以执行以下功能 文件 ...

  2. MYSQL查询计划KEY_LEN

    http://www.innomysql.com/article/25241.html 1 key_len的含义 2 MySQL中key_len计算规则 3 通过key_len分析联合索引 本文首先介 ...

  3. 自己做的萌萌哒的js宠物挂件~

    OwO萌物v1.1 类似wp伪春菜,但纯js不用后端,且可定制程度非常高~,3个人格示例,需要的童鞋自提 仙六 - 越祈 作者:正逍遥0716 2016/5/15 CLANNAD - 藤林杏 作者:正 ...

  4. 使用附加导航(affix)实现内容切换

    <!DOCTYPE html> <html> <head> <title> new document </title> <meta c ...

  5. linux系统时间同步更新

    linux中的时钟分为系统时钟和硬件时钟.硬件时钟通过bioss进行设置,系统时钟通过linux kernel进行设置.当linux启动时,bioss会读取系统时钟的时钟设置.在linux中涉及时间设 ...

  6. 10.8 noip模拟试题

      1.花 (flower.cpp/c/pas) [问题描述] 商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的 ...

  7. python爬虫scrapy的Selectors参考文档

    http://doc.scrapy.org/en/1.0/topics/selectors.html#topics-selectors-htmlcode

  8. (转)VS2012网站发布详细步骤

    2.弹出网站发布设置面板,点击<新建..>,创建新的发布配置文件: 4. 在配置中,要选择“Release”——发布模式(Release   称为发布版本,它往往是进行了各种优化,使得程序 ...

  9. OBJECT和EMBED标签(转载)

    一.介绍: 我们要在网页中正常显示flash内容,那么页面中必须要有指定flash路径的标 签.也就是OBJECT和EMBED标签.OBJECT标签是用于windows平台的IE浏览器的,而EMBED ...

  10. CTE-递归[2]

    在此之前写过一个CTE的递归,取出了所有的子节点,基本上可以满足大多数的需求,这里我们来延伸一下:首先我们回顾下原来的场景 图片的上半部分递归查出某个节点的所有子节点,这个我们已经通过CTE实现了,可 ...