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!$ (本来看着题意比较简单想捡个软柿子捏,结果手断了… ...
随机推荐
- 记录下java的个人测试方法
IDEA,用 JUnitGenerator V2. 0 做单元测试.. 如果是 SpringBoot,测试类上面加注解 @RunWith(SpringJUnit4ClassRunner.class) ...
- Nginx实现负载均衡(nginx + tomcat应用分布式)
一. 工具 nginx-1.8.0 apache-tomcat-6.0.33 二. 目标 实现高性能负载均衡的Tomcat集群: 三. 步骤 1.首先下载Nginx ...
- bzoj1139:[POI2009]Wie
传送门 状压dp,最短路 spfa似乎特别慢 代码: #include<cstdio> #include<iostream> #include<algorithm> ...
- MySQL习题1 一对多实例 产品和分类
/* 需求:建立产品和分类表 1.查询每种分类的产品数量,没有产品的分类也要统计.(cname,quantity) 2.根据分类名称查询分类中的所有产品 */ -- ----------------- ...
- 081 Search in Rotated Sorted Array II 搜索旋转排序数组 ||
这是 “搜索旋转排序数组”问题的跟进:如果数组元素允许重复,怎么办?这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?假设按照升序排序的数组在预先未知的某个关键点上旋转.(例如, 0 1 2 4 ...
- solr亿万级索引优化实践-自动生成UUID
solr亿万级索引优化实践(三) 原创 2017年03月14日 17:03:09 本篇文章主要介绍下如何从客户端solrJ以及服务端参数配置的角度来提升索引速度. solrJ6.0提供的 ...
- MDX之Avg函数使用
日均值是比较常见的指标,本文对 MDX 计算日均值做一个总结 MDX 计算日均值,表达式一 WITH MEMBER Measures.[日均值] AS Avg( Descendants( ...
- 利用apache限制IP并发数和下载流量控制
一,为什么要对IP并发数,下载流量进行控制 说正题之前,先给大家讲个故事,那是在2007年,我进了一家公司,当时我们正在给达芙妮做电子商务网,www.idaphne.com.从三月份开始做的吧,九月份 ...
- java中 awt Graphics2D
Graphics2D ,Graphics 类,提供了对几何形状.坐标转换.颜色管理和文本布局更为复杂的控制.它是用于在 Java(tm) 平台上呈现二维形状.文本和图像的基础类.验证码生成可以用到此类 ...
- 6.html图像标记img
<html> <head> <title>第六课标签</title> <meta charset="utf-8"> &l ...