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!$ (本来看着题意比较简单想捡个软柿子捏,结果手断了… ...
随机推荐
- 大数据技术之_27_电商平台数据分析项目_02_预备知识 + Scala + Spark Core + Spark SQL + Spark Streaming + Java 对象池
第0章 预备知识0.1 Scala0.1.1 Scala 操作符0.1.2 拉链操作0.2 Spark Core0.2.1 Spark RDD 持久化0.2.2 Spark 共享变量0.3 Spark ...
- Linux安装Loadrunner generator
安装环境:redhat 6.5 64位版 从网上下载 loadrunner-11-load-generator.iso 文件 先创建一个iso 目录,用来挂载 iso 文件 mkdir iso 挂载i ...
- js框架:jQuery
· jQuery是一个轻量级的“写的少,做的多”的JavaScript函数库(jQuery版本2以上不支持IE6,7,8) · jQuery 的功能概括: 1.html 的元素选取 2.html的元素 ...
- C. Chessboard( Educational Codeforces Round 41 (Rated for Div. 2))
//暴力 #include <iostream> #include <algorithm> #include <string> using namespace st ...
- ios 微信登录相关
引入项目的文件 info.plist 添加内容 WXApi.registerApp(Config.wx.APP_ID,enableMTA: true)//注册微信api(在AppDelegate里面注 ...
- mongodb vs redis(Tokyo Tyrant转)
* MongoDB vs Redis vs Tokyo Tyrant(原文链接:http://www.cnblogs.com/riceball/archive/2010/03/05/MongoDB_V ...
- Flask (七) 部署
阿里云部署Flask项目 部署Flask项目和部署Django项目基本一致,我们也使用uwsgi+nginx 我们在部署Django项目基础上部署Flask项目 1, 将uwsgi.ini ...
- AtCoder Regular Contest 078 D
D - Fennec VS. Snuke Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Statement F ...
- HDU 5230 ZCC loves hacking 大数字的整数划分
http://acm.hdu.edu.cn/showproblem.php?pid=5230 把题目简化后,就是求 1---n - 1这些数字中,将其进行整数划分,其中整数划分中不能有重复的数字,如果 ...
- 開玩樹莓派(二):配置IP,實現無顯示器局域網內Putty連接和RDP遠程
目錄: 開玩樹莓派(一):安裝Raspbian系統 開玩樹莓派(二):配置IP,實現無顯示器局域網內Putty連接和RDP遠程 開玩樹莓派(三):Python編程 開玩樹莓派(四):GPIO控制和遠程 ...