Luogu P3727 曼哈顿计划E 点分治+hash
题目:
分析:
大长题面容易给人一种不可做的错觉,但是这题考的知识点都是我们熟悉的。
稍加分析我们可以得到,我们可以把每个点当成一个单独的游戏,如果k=1,就是简单的nim游戏,这样,当多个游戏放在一起的时候,我们就可以根据一条链的权值异或和来判断必胜必败。
这个给我们启发,根据SG定理(应该是这个定理?)当我们选一条链,根据这条链上所有点的SG函数的异或和,可以判断胜负。
所以我们可以对于每个k想办法求点的sg函数,就可以用点分治解决这个题。
怎么求sg函数?(打表找规律啊),或者如果你有办法推也可以。
代码:
#include<bits/stdc++.h>
#define ms(a,x) memset(a,x,sizeof(a))
using namespace std;
const int N=,M=1e7;
struct node{int y,nxt;}e[N*];
int t,n,k,s,c=,hs,pd,nt,h[N];
int w[N],siz[N],vis[N],tp[N],tt[N];
void add(int x,int y){
e[++c]=(node){y,h[x]};h[x]=c;
e[++c]=(node){x,h[y]};h[y]=c;
} int sg1(int x){return x;}
int sg2(int x){return (x+)%(s+)?x&:;}
int sg3(int x){return x/s;}
int sg4(int x){
switch(x%){
case : return x-;
case : return x+;
default : return x;
}
} void init(){
ms(h,);ms(vis,);c=;
} void gs(int x,int fa){
siz[x]=;
for(int i=h[x],y;i;i=e[i].nxt)
if((y=e[i].y)!=fa&&!vis[y])
gs(y,x),siz[x]+=siz[y];
} int gg(int x,int fa){
for(int i=h[x],y;i;i=e[i].nxt)
if((y=e[i].y)!=fa&&!vis[y]&&siz[y]>=hs)
return gg(y,x);return x;
} void dfs(int x,int fa,int o){
tt[nt]=x;tp[nt++]=o;
for(int i=h[x],y;i;i=e[i].nxt)
if((y=e[i].y)!=fa&&!vis[y]) dfs(y,x,o^w[y]);
} struct Hash{
static const int P1=,P2=;
int h1(int x){return x%P1;}
int h2(int x){return x%P2;}
int t1[P1],t2[P2],st[N],top;
Hash(){ms(t1,-);ms(t2,-);}
int find(int x){
return t1[h1(x)]==x||t2[h2(x)]==x;
} void insert(int x){
if(find(x)) return ;
int h=h2(x);st[top++]=x;
if(t2[h]==-) t2[h]=x;
else while(~x){
h=h1(x);swap(x,t1[h]);
if(x==-) return ;
h=h2(x);swap(x,t2[h]);
}
} void del(int x){
if(t1[h1(x)]==x) t1[h1(x)]=-;
else t2[h2(x)]=-;
} void clear(){
while(top) del(st[--top]);
}
}H;void dc(int x){
gs(x,);hs=siz[x]>>;int g;
g=gg(x,);vis[g]=;H.insert();
for(int i=h[g],y;i;i=e[i].nxt)
if(!vis[y=e[i].y]){
nt=;dfs(y,,w[y]);
for(int j=;j<nt;j++)
if(H.find(w[g]^tp[j]))
{pd=;break;}
for(int j=;j<nt;j++)
H.insert(tp[j]);
} H.clear();
for(int i=h[g],y;i&&!pd;i=e[i].nxt)
if(!vis[y=e[i].y]) dc(y);return ;
} int main(){
scanf("%d",&t);while(t--){
init();scanf("%d",&n);
for(int i=,y,x;i<n;i++)
scanf("%d%d",&x,&y),add(x,y);
for(int i=;i<=n;i++)
scanf("%d",&w[i]);scanf("%d",&k);
int (*sg)(int);
if(k==) sg=sg1;
else if(k==) scanf("%d",&s),sg=sg2;
else if(k==) scanf("%d",&s),sg=sg3;
else sg=sg4;pd=;
for(int i=;i<=n;i++)
if(!(w[i]=sg(w[i]))) pd=;
if(!pd) dc();
puts(pd?"Mutalisk ride face how to lose?":
"The commentary cannot go on!");
} return ;
}
博弈论+点分治
Luogu P3727 曼哈顿计划E 点分治+hash的更多相关文章
- BZOJ4598: [Sdoi2016]模式字符串(点分治 hash)
题意 题目链接 Sol 直接考虑点分治+hash匹配 设\(up[i]\)表示\(dep \% M = i\)的从下往上恰好与前\(i\)位匹配的个数 \(down\)表示\(dep \% M = i ...
- BZOJ.4598.[SDOI2016]模式字符串(点分治 Hash)
LOJ BZOJ 洛谷 点分治.考虑如何计算过\(rt\)的答案. 记\(pre[i]\)表示(之前的)子树内循环匹配了\(S\)的前缀\(i\)的路径有多少,\(suf[i]\)表示(之前的)子树内 ...
- 【BZOJ4598】[Sdoi2016]模式字符串 树分治+hash
[BZOJ4598][Sdoi2016]模式字符串 Description 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m的模式串s,其中每 ...
- [luogu P5349] 幂 解题报告 (分治FFT)
interlinkage: https://www.luogu.org/problemnew/show/P5349 description: solution: 设$g(x)=\sum_{n=0}^{ ...
- P3727 曼哈顿计划E
点分治+SG函数还真是令人意外的组合啊 思路 这道题看到找一条满足条件的链,想到点分治 看到博弈,想到SG函数 然后就变成一道SG函数+点分治的题了 然后1e9的SG函数怎么搞?当然是打表了 然后各种 ...
- Luogu 4721 【模板】分治 FFT
还不会这题的多项式求逆的算法. 发现每一项都是一个卷积的形式,那么我们可以使用$NTT$来加速,直接做是$O(n^2logn)$的,我们考虑如何加速转移. 可以采用$cdq$分治的思想,对于区间$[l ...
- BZOJ4598 [Sdoi2016]模式字符串 【点分治 + hash】
题目 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m 的模式串s,其中每一位仍然是A到z的大写字母.Alice希望知道,有多少对结点< ...
- BZOJ 2229 / Luogu P3329 [ZJOI2011]最小割 (分治最小割板题)
题面 求所有点对的最小割中<=c的数量 分析 分治最小割板题 首先,注意这样一个事实:如果(X,Y)是某个s1-t1最小割,(Z,W)是某个s2-t2最小割,那么X∩Z.X∩W.Y∩Z.Y∩W这 ...
- [Luogu P4178]Tree 题解(点分治+平衡树)
题目大意 给定一棵树,边带权,问有多少点对满足二者间距离$\leq K$,$n \leq 40000$. 题解 点分治专题首杀!$Jackpot!$ (本来看着题意比较简单想捡个软柿子捏,结果手断了… ...
随机推荐
- idea svn 问题
https://blog.csdn.net/liyantianmin/article/details/52837506
- webpack 中导入 vue 和普通网页使用 vue 的区别(四)
一:在普通网页中使用 vue 使用 script 标签,引入 vue 包 在 ndex 页面中,创建一个 id 为 App 的 div 容器 通过 new Vue 得到一个 vue 实例 二:在 we ...
- 消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用
消息队列介绍.RabbitMQ&Redis的重点介绍与简单应用 消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下 ...
- mongodb的基本命令操作
mongodb在已经存在管理员的情况下,需要创建一个库 使用管理员进入mongodb的命令行界面 mongo admin -u 管理员名 -p 管理员密码 创建库(进入库) use 库名 创建当前库的 ...
- log4j.properties 打印到控制台 写法
# 日志输出级别(INFO)和输出位置(stdout,R)log4j.rootLogger=INFO, stdout # 日志输出位置为控制台log4j.appender.stdout=org.apa ...
- Java之final、static关键字及匿名对象
个人通俗理解: 1.final:首先被final修饰的变量就自动变成的不能被修改的常量了.被修饰的类会自动变成太监类,只能有父类,不能有子类:被修饰的方法也不能被子类重写了:被修饰的引用变量值也不能更 ...
- phpmyadmin消除无法保存最近表的提示
运行 sudo dpkg-reconfigure phpmyadmin 重新配置phpmyadmin ip选择127.0.0.1,端口3306,"MySQL username for php ...
- [问题记录]Ubuntu下chmsee安装失败的解决
日期:2016年2月26日 一直在找Ubuntu下查看chm的工具但是普遍不理想,发现在deepin中的chmsee相对比较好,但是直接执行网上的sudo apt-get install chmsee ...
- IIS 服务器支持下载apk 文件
前不久,在本地IIS文件下部署一个网站,可以下载apk文件,就是测试apk应用升级,发现访问不能下载,原因是IIS没有配置对这种apk文件的处理程序. 解决方案如下所示: 1.打开IIS, 找到MIM ...
- Objective-C Protocols
Objective-C allows you to define protocols, which declare the methods expected to be used for a part ...