P3727 曼哈顿计划E
点分治+SG函数还真是令人意外的组合啊
思路
这道题看到找一条满足条件的链,想到点分治
看到博弈,想到SG函数
然后就变成一道SG函数+点分治的题了
然后1e9的SG函数怎么搞?当然是打表了
然后各种出锅
- 多组数据记得清零
- SG函数不要打错表QwQ
因为对着租酥雨julao的blog调了好久,所以代码极其相似
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <unordered_map>
using namespace std;
int T,n,s,k,fir[30100],nxt[30100<<1],u[30100<<1],v[30100<<1],cnt,root,sz[30100],f[30100],vis[30100],ass=0,Siz,w_p[30100],tp_val;
unordered_map<int,int> S;
void addedge(int ui,int vi){
cnt++;
u[cnt]=ui;
v[cnt]=vi;
nxt[cnt]=fir[ui];
fir[ui]=cnt;
}
int SG3(int x){//k==3 时 , SG[x]=floor(x/k)
return x/s;
}
int SG1(int x){//k==1 时 , SG[x]=x
return x;
}
int SG2(int x){
if((x+1)%(s+1)==0)
return 2;
else
return x%2;
}
int SG4(int x){
if(!x)
return 0;
if(x%4==1||x%4==2)
return x;
if(x%4==3)
return x+1;
else
return x-1;
}
int SG(int x){
if(k==1)
return SG1(x);
else if(k==2)
return SG2(x);
else if(k==3)
return SG3(x);
else if(k==4)
return SG4(x);
else
return 0;
}
void findroot(int u,int fa){
sz[u]=f[u]=1;
for(int i=fir[u];i;i=nxt[i]){
if(vis[v[i]]||v[i]==fa)
continue;
findroot(v[i],u);
sz[u]+=sz[v[i]];
f[u]=max(f[u],sz[v[i]]);
}
f[u]=max(Siz-sz[u],f[u]);
if(f[u]<f[root] || !root)
root=u;
}
void queryhas(int u,int fa,int d){
if(S[d^tp_val])
ass=1;
for(int i=fir[u];i;i=nxt[i]){
if(v[i]==fa||vis[v[i]])
continue;
queryhas(v[i],u,d^w_p[v[i]]);
}
}
void getxor(int u,int fa,int d){
S[d]++;
for(int i=fir[u];i;i=nxt[i]){
if(v[i]==fa||vis[v[i]])
continue;
getxor(v[i],u,d^w_p[v[i]]);
}
}
void divide(int u){
vis[u]=true;
S[0]++;
tp_val=w_p[u];
for(int i=fir[u];i;i=nxt[i]){
if(vis[v[i]])
continue;
queryhas(v[i],0,w_p[v[i]]);
getxor(v[i],0,w_p[v[i]]);
}
S.clear();
for(int i=fir[u];i;i=nxt[i]){
if(vis[v[i]])
continue;
Siz=sz[v[i]];
root=0;
findroot(v[i],0);
divide(root);
}
}
// void SG(int s){
// for(int i=1;i<=90;i++){
// memset(barrel,0,sizeof(barrel));
// for(int j=1;j<=i;j++){
// barrel[sg[i-j]]=true;
// }
// for(int j=1;j<i;j++){
// barrel[sg[j]^sg[i-j]]=true;
// }
// for(int j=0;j<=10000-1;j++)
// if(!barrel[j]){
// sg[i]=j;
// break;
// }
// }
// }
int main(){
#ifndef ONLINE_JUDGE
freopen("t.in","r",stdin);
#endif
scanf("%d",&T);
while(T--){
memset(fir,0,sizeof(fir));
memset(nxt,0,sizeof(nxt));
memset(vis,0,sizeof(vis));
cnt=0;
ass=0;
S.clear();
scanf("%d",&n);
for(int i=1;i<=n-1;i++){
int a,b;
scanf("%d %d",&a,&b);
addedge(a,b);
addedge(b,a);
}
for(int i=1;i<=n;i++)
scanf("%d",&w_p[i]);
scanf("%d",&k);
if(k==2||k==3)
scanf("%d",&s);
for(int i=1;i<=n;i++)
w_p[i]=SG(w_p[i]);
root=0;
Siz=n;
findroot(1,0);
divide(root);
if(ass)
printf("Mutalisk ride face how to lose?\n");
else
printf("The commentary cannot go on!\n");
}
return 0;
}
P3727 曼哈顿计划E的更多相关文章
- Luogu P3727 曼哈顿计划E 点分治+hash
题目: P3727曼哈顿计划E 分析: 大长题面容易给人一种不可做的错觉,但是这题考的知识点都是我们熟悉的. 稍加分析我们可以得到,我们可以把每个点当成一个单独的游戏,如果k=1,就是简单的nim游戏 ...
- [洛谷]P3729 曼哈顿计划EX(最小割树/等价流树)
题目大意:给出一张n个点m条边的无向图,每个点有点权,q次询问,每次给出k,要求选出若干个点点权之和不小于k,求一个最大的值x,使得选出的点中任意两点之间至少有x条互不相交的链.(n<=550, ...
- [luoguP3729]曼哈顿计划EX
来自FallDream的博客,未经允许,请勿转载,谢谢. 艾登拥有一个计算机网络,每一台计算机都至少有着Intel Xeon E50 v40 + 40路GTX10800Titan的恐怖配置,并由无线网 ...
- [Luogu3727]曼哈顿计划E
luogu 题意(简化版) 给你一棵树,每个点上有一个\(SG\)值,问你是否存在一条路径使得\(SG\)异或和为\(0\). sol 可以当做每个点的稳定值就是这个点上的石子数量. 很显然我们只需要 ...
- LDA( Latent Dirichlet Allocation)主题模型 学习报告
1 问题描述 LDA由Blei, David M..Ng, Andrew Y..Jordan于2003年提出,是一种主题模型,它可以将文档集中每篇文档的主题以概率分布的形式给出,从而通过分析一 ...
- 从下往上看--新皮层资料的读后感 第三部分 70年前的逆向推演- 从NN到ANN
第三部分 NN-ANN 70年前的逆向推演 从这部分开始,调整一下视角主要学习神经网络算法,将其与生物神经网络进行横向的比较,以窥探一二. 现在基于NN的AI应用几乎是满地都是,效果也不错,这种貌似神 ...
- Monte Carlo方法简介(转载)
Monte Carlo方法简介(转载) 今天向大家介绍一下我现在主要做的这个东东. Monte Carlo方法又称为随机抽样技巧或统计实验方法,属于计算数学的一个分支,它是在上世纪四十年代 ...
- 蒙特·卡罗算法的Python实现
一 背景 此算法诞生的背景是: 曼哈顿计划,有极大的计算需求. 计算机刚开始发展,最适合做计算. 蒙特卡洛算法理论基础是概率论,实际就是暴力计算逼近理想结果.正是在以上两个背景下,它刚好得到了极大的应 ...
- 随机采样方法整理与讲解(MCMC、Gibbs Sampling等)
本文是对参考资料中多篇关于sampling的内容进行总结+搬运,方便以后自己翻阅.其实参考资料中的资料写的比我好,大家可以看一下!好东西多分享!PRML的第11章也是sampling,有时间后面写到P ...
随机推荐
- sitecore系统教程之架构概述
Sitecore体验数据库(xDB)从实时大数据存储库中的所有通道源收集所有客户交互.它连接交互数据,为每个客户创建全面,统一的视图,并使营销人员可以使用数据来管理客户的实时体验. xDB架构非常灵活 ...
- maven 核心概念
1). 项目构建过程中的各个环节 . 清理 . 编译 . 测试 . 报告 . 打包 . 安装 . 部署 2). 配置环境变量 . 配置 JDK 配置 JAVA_HOME + PATH maven 需要 ...
- 使用函数接口和枚举实现配置式编程(Java与Scala实现)
概述 做报表时,有时需要根据不同的业务生成不同的报表.这样,需要能够动态地配置列字段,并根据列字段来输出对应的报表.使用函数接口结合枚举可以比较优雅地实现配置式编程. 问题描述如下: 假设有对象 St ...
- L1正则和L2正则的比较分析详解
原文链接:https://blog.csdn.net/w5688414/article/details/78046960 范数(norm) 数学上,范数是一个向量空间或矩阵上所有向量的长度和大小的求和 ...
- Linux基础命令---文本显示tac
tac 将指定文件中的行,按照反序方式显示.此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法 tac [选项] ...
- 【JavaScript 6连载】三、构造函数
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- printf、fprintf、sprintf和snprintf 区别
都是把格式好的字符串输出,只是输出的目标不一样: 1 printf,是把格式字符串输出到标准输出(一般是屏幕,可以重定向). 2 sprintf,是把格式字符串输出到指定字符串中,所以参数比print ...
- Android几种解析XML方式的比较
https://blog.csdn.net/isee361820238/article/details/52371342 一.使用SAX解析XML SAX(Simple API for XML) 使用 ...
- EL和jstl(概念和使用方法)
概念: 1 . JSP 标签 是用来替换java代码的技术,容器遇到标签后会将其转换成java代码,jsp标签类似于开始标记.属性.结束标记.标签体. EL表达式是一套简单的运算规则,用于给jsp标 ...
- SQL介绍
SQL,即structured query language,结构化查询语言,是一种对关系型数据库中的数据进行管理和操作的语言方法,SQL包括6个部分 DQL:数据查询语言,最常用的为select,其 ...