清北学堂2019.7.18 & 清北学堂2019.7.19
Day 6 钟皓曦
经典题目:石子合并
可以合并任意两堆,代价为数量的异或(^)和
f[s]把s的二进制所对应石子合并成一堆所花代价
枚举s的子集
#include<iostream> using namespace std; int main()
{
cin >> n;
for (int a=;a<n;a++)
cin >> z[a];
for (int a=;a<(<<n);a++)
for (int b=;b<n;b++)
if (a & (<<b))
sum[a] += z[b]; memset(f,0x3f,sizeof(f));
for (int a=;a<n;a++)
f[<<a] = ; for (int s=;s<(<<n);s++)
for (int a=;a<s;a++)
if ( (s|a) == s)
f[s] = min(f[s],f[a]+f[a^s]+(sum[a]^sum[a^s])); for (int s=;s<(<<n);s++)
for (int a=(s-)&s;a;a=(a-)&s)
f[s] = min(f[s],f[a]+f[a^s]+(sum[a]^sum[a^s])); cout << f[(<<n)-] << endl; }
然后今天的正题就是博弈论dp了【nim游戏:据说80%的博弈论dp最终都会转化到nim游戏上来】
其实这种题型只与Alice和Bob有关(大雾
这种东西大概是这样的
有一个游戏g,有两个人Alice和Bob在Van它,是回合制游戏,该游戏无平局,胜负条件:当某个人无法操作时就输了
下面以好多好多的题来说明
T1
有一个整数S(2<=S<=200),先手在S上减掉一个数x,至少是1,但小于S。之后双方轮流把S减掉一个正整数,但都不能超过先前一回合对方减掉的数的k倍,减到0的一方获胜。问先手是否必胜?
solution:
从一个状态转到另外一种状态,会有必败态和必胜态出现
f[s] s->false 必报 s->true 必胜
状态由s->s1.s2.s3······
若对于任意的f[si]=true则走向了必胜态。
直接记忆化搜索!
dp[i][j]表示当前剩下的数为i,最多能减的数为j的状态,dp[i][j] = = 1必胜,否则必败
dp[i][j]->dp[i-x][x*k](1<=x<=j)
如果对于某个x, dp[i-x][x*k] = = 0,则dp[i][j]=1,否则dp[i][j]=0
要求的为dp[S][S-1]
O(S^3)
f[i][j]还剩下i,对手上一轮减的数字是j,此时自己是必胜态还是必败态【伪代码】
#include<iostream> using namespace std; bool f[][],g[][]; bool dfs(int i,int j)
{
if (i==) return false;
if (g[i][j]) return f[i][j];
g[i][j]=true;f[i][j]=false;
for (int r=;r<=i && r<=k*j;r++)
if (dfs(i-r,r) == false) f[i][j]=true;
return f[i][j];
} int main()
{
cin >> s >> k;
for (int a=;a<s;a++)
if (dfs(s-a,a) == false)
{
cout << "Alice" << endl;
return ;
}
cout << "Bob" << endl; return ;
}
T2
若现在有n个游戏
定义sg函数:能转移到的状态中sg函数里没有出现的最小的自然数
sg[0]=0

sg定理:
n个游戏的sg值=每个sg值异或起来
T3
若现在一次只能取走1-4个石子
同样的操作:sg[0]=0 sg[1]=1 sg[2]=2 sg[3]=3 sg[4]=4 sg[5]=0
T4
n+1堆石子,最左边一堆石头有2012个,两个人分别进行操作。一次操作可以选取两堆不同的石堆分别增加或减少一个石子(一加一减,或给已经不剩石子的堆加一个都是允许的)。为了保证游戏会在有限步内结束,规定所选的两堆中右边的那一堆一定要包含奇数个石子,无路可走者输.问先手是否必胜?
计算n堆的奇偶性,把所有奇数石子堆的下标取出来异或,看答案是否为0
有两堆一样的石子与没有事一个概念
通过转化奇数堆的石子,来解决问题
将最左边一堆视为第0堆,将石子数为奇数的石子堆的编号异或起来,结果为0则先手必败,否则必胜
其实是转化为了nim博弈
T5
u 有N堆石子放在N级楼梯上,楼梯编号为0..N-1,每堆有a[n]个石子。两人轮流游戏,每次将任意堆中的任意个石子移动到它下面那一层楼梯上,0号的石子不能动。直到所有石子都移动到0号,那个人就赢了。问先手是否有必胜策略 。
将距离终点步数为奇数的格子棋子数量异或起来就是答案
T6
u1xN(1<=N<=2000)的空格子,双方轮流操作,每次选一个没有被标记的格子,将其标记,如果某人操作完后,存在3个连续的格子都被标记了,那么他就获胜了,问先手是否有必胜策略?
把一个游戏看成多个游戏

再分成多个游戏
sg[i],对于一个长度为i的横条的sg值为多少
防止越界:在数组后面加一个足够大的数就行
#include<iostream>
#include<algorithm>
#include<vector> using namespace std; int dfs(int n)
{
if (n==) return ;
if (f[n]) return sg[n];
f[n]=true;
vector<int> z;
for (int a=;a<=n;a++)
{
int l = max(a-,);
int r = max(n-a-,);
z.push_back( dfs(l) ^ dfs(r) );
}
sort(z.begin(),z.end());
z.push_back(); for (int a=,p=;;a++)
{
if (z[p] != a)
{
sg[n] = a;
return sg[n];
}
while (z[p]==a)
p++;
}
} int main()
{
cin >> n;
if (dfs(n)) cout << "Alice" << endl;
else cout << "Bob" << endl;
}
留一个练习:
bzoj2798
Day 7 钟皓曦
消防局的设立
不用dp的做法
N<=100000
f[i][0/1][k]
在自己,父亲,兄弟,爷爷结点都能将其覆盖

(显然放4结点最优)
首先对于这棵树,找出深度最深的结点,找到其爷爷,在爷爷结点放一个士兵,把他爷爷能覆盖到的结点删掉,以此类推,对剩下的树进行类似操作,直至树全被覆盖
用堆维护,时间复杂度O(n log n)

求出n的k个因子
再计算m^k即可
若将人进行编号,求不同分组呢?
每组有 n/r 个人,则方案数为

这么多种情况,然后化简


用过欧拉定理后转化为计算


1e9-401是个质数,而1e9-402=2*13*5281*7283
让n的阶乘%2 13 5281 7283
再合并
因为%数较小,一定会有循环节出现






f[i][j]表示走了i步,走到了j

N个点的数,有点权
有m次询问,每次给两个点p1,p2,在这条路径上能否找出三个点,使得它们可以形成三角形
m,n<=1e6
斐波那契数列
若两点的距离大于42,输出yes
若小于等于,暴力即可
bzoj 树上三角形
清北学堂2019.7.18 & 清北学堂2019.7.19的更多相关文章
- 2019.3.18考试&2019.3.19考试&2019.3.21考试
2019.3.18 C O D E T1 树上直接贪心,环上for一遍贪心 哇说的简单,码了将近一下午终于码出来了 感觉自己码力/写题策略太糟糕了,先是搞了一个细节太多的写法最后不得不弃疗了,然后第二 ...
- MySQL存储过程-2019/7/18
MySQL 5.0 版本开始支持存储过程. 存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象. 存储过程是为了完成特定功能的SQL语句集,经编 ...
- HPU积分赛 2019.8.18
A题 给出n个数,问这n个数能不能分成奇数个连续的长度为奇数并且首尾均为奇数的序列 Codeforces849A 题解传送门 代码 1 #include <bits/stdc++.h> 2 ...
- CVPR目标检测与实例分割算法解析:FCOS(2019),Mask R-CNN(2019),PolarMask(2020)
CVPR目标检测与实例分割算法解析:FCOS(2019),Mask R-CNN(2019),PolarMask(2020)1. 目标检测:FCOS(CVPR 2019)目标检测算法FCOS(FCOS: ...
- 清北学堂2019.8.10 & 清北学堂2019.8.11 & 清北学堂2019.8.12
Day 5 杨思祺(YOUSIKI) 今天的难度逐渐上升,我也没做什么笔记 开始口胡正解 今天的主要内容是最小生成树,树上倍增和树链剖分 最小生成树 Prim 将所有点分为两个集合,已经和点 1 连通 ...
- 6362. 【NOIP2019模拟2019.9.18】数星星
题目描述 题解 一种好想/好写/跑得比**记者还快的做法: 对所有询问排序,按照R递增的顺序来处理 维护每个点最后一次被覆盖的时间,显然当前右端点为R时的答案为所有时间≥L的点的权值之和 LCT随便覆 ...
- MySQL 8.0.18 在 Windows Server 2019 上的安装(ZIP)公开
AskScuti MySQL : Windows Server 2019 安装 MySQL 8.0 温馨提示:为了展现我最“魅力”的一面,请用谷歌浏览器撩我. 一切就绪,点我开撩
- MySQL 8.0.18 在 Windows Server 2019 上的安装(MSI)公开
AskScuti MySQL : Windows Server 2019 安装 MySQL 8.0 温馨提示:为了展现我最“魅力”的一面,请用谷歌浏览器撩我.那个 IE 啊,我很无奈. 一切就绪,点我 ...
- 2019/4/18 wen 线程
随机推荐
- Python 描述符 (descriptor)
1.什么是描述符? 描述符是Python新式类的关键点之一,它为对象属性提供强大的API,你可以认为描述符是表示对象属性的一个代理.当需要属性时,可根据你遇到的情况,通过描述符进行访问他(摘自Pyth ...
- java获取json数组格式中的值
第一种方法: String str = "{'array':[{'id':5,'name':'张三'},{'id':6,'name':'李四'}]}"; JSONArray jso ...
- 【抓包工具】使用Fiddler关于“由于目标计算机积极拒绝,无法连接。”的解决方案
今天使用Fiddler的时候遇到下面这个问题:在地址栏想打开个一般处理程序,出现连接本机失败的提示,如下图: 而这在我没打开Fiddler的时候是显示正常的. 查看Fiddler,在嗅探 -> ...
- EF部分字段修改 自动忽略为null字段
传入一个实体 student(){id = 1,name = "测试" age = null,sex = null} 下面 是修改的方法 public async Task Edi ...
- linux如何配置使用sendEmail发送邮件
sendEmail是一个轻量级.命令行的SMTP邮件客户端.如果你需要使用命令行发送邮件,那么sendEmail是非常完美的选择.使用简单并且功能强大.这个被设计用在php.bash.perl和web ...
- Ubuntu伪破解Navicat12方法
一.去官网下载navicat112_premium_cs_x64 for linux版本二.用tar解压安装包三.navicat解压即可用,直接进入解压后的目录,然后用‘./’运行start_navi ...
- YARN组件详细介绍
一.ResourceManager 内部主要有两个组件: 1.Scheduler:这个组件完全是插拔式的,用户可以根据自己的需求实现不同的调度器,目前YARN提供了FIFO.容量以及公平调度器.这个组 ...
- 机器学习聚类算法之DBSCAN
一.概念 DBSCAN是一种基于密度的聚类算法,DBSCAN需要两个参数,一个是以P为中心的邻域半径:另一个是以P为中心的邻域内的最低门限点的数量,即密度. 优点: 1.不需要提前设定分类簇数量,分类 ...
- Lindström–Gessel–Viennot lemma
解决不相交路径计数 有两个大小为N的点集A,B A上每一个点对应着B的每一个点 求满足条件的路径集合有多少个 图里面可能还有一些障碍 Codeforces 348 D 有一个N*M的网格图 有两个点 ...
- poj1419 Graph Coloring 最大独立集(最大团)
最大独立集: 顶点集V中取 K个顶点,其两两间无连接. 最大团: 顶点集V中取 K个顶点,其两两间有边连接. 最大独立集=补图的最大团最大团=补图的最大独立集 #include<iostream ...