luogu

题意(简化版)

给你一棵树,每个点上有一个\(SG\)值,问你是否存在一条路径使得\(SG\)异或和为\(0\)。

sol

可以当做每个点的稳定值就是这个点上的石子数量。

很显然我们只需要把每个点的\(SG\)值处理出来后面的就好做了。

分别考虑\(k\)的不同取值下的\(SG\)函数的计算方法。

\(k=1\)

每堆石子可以任意取,显然\(SG(x)=x\)。

\(k=2\)

打表/手玩可以发现,若\(x\)恰好为\(S+1\)的倍数\(-1\)时\(SG(x)=2\),否则\(SG(x)=x\%2\)

\(k=3\)

打表/手玩可以发现,\(SG(x)=\lfloor \frac{x}{S}\rfloor\)。

\(k=4\)

打表可以发现,

\[SG(x)=
\begin{cases}
0 & \text{ , } x= 0 \\
x & \text{ , } x\equiv 1,2 (mod\ 4) \\
x+1 & \text{ , } x\equiv 3 (mod\ 4) \\
x-1 & \text{ , } x\equiv 0 (mod\ 4)
\end{cases}
\]

剩下的就很简单了,点分治每次考虑所有过重心的路径。开\(set\)记录每个点到分治重心的异或和,注意对重心的处理。

code

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<set>
using namespace std;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 3e4+5;
int T,n,k,s,to[N<<1],nxt[N<<1],head[N],cnt,val[N];
int vis[N],sz[N],w[N],root,sum,val_top,fg;
set<int>S;
int SG(int x)
{
if (k==1) return x;
if (k==2) return (x+1)%(s+1)?x&1:2;
if (k==3) return x/s;
if (k==4){
if (x==0) return 0;
if (x%4==1||x%4==2) return x;
if (x%4==3) return x+1;
else return x-1;
}
}
void link(int u,int v)
{
to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;
}
void getroot(int u,int f)
{
sz[u]=1;w[u]=0;
for (int e=head[u];e;e=nxt[e])
if (to[e]!=f&&!vis[to[e]])
{
getroot(to[e],u);
sz[u]+=sz[to[e]];w[u]=max(w[u],sz[to[e]]);
}
w[u]=max(w[u],sum-sz[u]);
if (w[u]<w[root]) root=u;
}
void dfs1(int u,int f,int sta)
{
if (S.find(sta^val_top)!=S.end()) fg=1;
for (int e=head[u];e;e=nxt[e])
if (to[e]!=f&&!vis[to[e]])
dfs1(to[e],u,sta^val[to[e]]);
}
void dfs2(int u,int f,int sta)
{
S.insert(sta);
for (int e=head[u];e;e=nxt[e])
if (to[e]!=f&&!vis[to[e]])
dfs2(to[e],u,sta^val[to[e]]);
}
void solve(int u)
{
vis[u]=1;S.insert(0);val_top=val[u];
for (int e=head[u];e;e=nxt[e])
if (!vis[to[e]])
dfs1(to[e],0,val[to[e]]),dfs2(to[e],0,val[to[e]]);
S.clear();
for (int e=head[u];e;e=nxt[e])
if (!vis[to[e]])
{
sum=sz[to[e]];root=0;
getroot(to[e],0);solve(root);
}
}
int main()
{
T=gi();
while (T--)
{
n=gi();cnt=fg=0;
memset(head,0,sizeof(head));
memset(vis,0,sizeof(vis));
for (int i=1;i<n;++i)
{
int u=gi(),v=gi();
link(u,v);link(v,u);
}
for (int i=1;i<=n;++i) val[i]=gi();
k=gi();if (k==2||k==3) s=gi();
for (int i=1;i<=n;++i) val[i]=SG(val[i]);
root=0;w[0]=sum=n;
getroot(1,0);solve(root);
if (fg) puts("Mutalisk ride face how to lose?");
else puts("The commentary cannot go on!");
}
return 0;
}

[Luogu3727]曼哈顿计划E的更多相关文章

  1. 点分治题单(来自XZY)

    点分治题单(来自XZY) 静态点分治 [x] 洛谷 P3806 [模板]点分治1 [x] 洛谷 P4178 Tree [x] 洛谷 P2634 [国家集训队]聪聪可可 [x] 洛谷 P4149 [IO ...

  2. Luogu P3727 曼哈顿计划E 点分治+hash

    题目: P3727曼哈顿计划E 分析: 大长题面容易给人一种不可做的错觉,但是这题考的知识点都是我们熟悉的. 稍加分析我们可以得到,我们可以把每个点当成一个单独的游戏,如果k=1,就是简单的nim游戏 ...

  3. [洛谷]P3729 曼哈顿计划EX(最小割树/等价流树)

    题目大意:给出一张n个点m条边的无向图,每个点有点权,q次询问,每次给出k,要求选出若干个点点权之和不小于k,求一个最大的值x,使得选出的点中任意两点之间至少有x条互不相交的链.(n<=550, ...

  4. [luoguP3729]曼哈顿计划EX

    来自FallDream的博客,未经允许,请勿转载,谢谢. 艾登拥有一个计算机网络,每一台计算机都至少有着Intel Xeon E50 v40 + 40路GTX10800Titan的恐怖配置,并由无线网 ...

  5. P3727 曼哈顿计划E

    点分治+SG函数还真是令人意外的组合啊 思路 这道题看到找一条满足条件的链,想到点分治 看到博弈,想到SG函数 然后就变成一道SG函数+点分治的题了 然后1e9的SG函数怎么搞?当然是打表了 然后各种 ...

  6. LDA( Latent Dirichlet Allocation)主题模型 学习报告

    1     问题描述 LDA由Blei, David M..Ng, Andrew Y..Jordan于2003年提出,是一种主题模型,它可以将文档集中每篇文档的主题以概率分布的形式给出,从而通过分析一 ...

  7. 从下往上看--新皮层资料的读后感 第三部分 70年前的逆向推演- 从NN到ANN

    第三部分 NN-ANN 70年前的逆向推演 从这部分开始,调整一下视角主要学习神经网络算法,将其与生物神经网络进行横向的比较,以窥探一二. 现在基于NN的AI应用几乎是满地都是,效果也不错,这种貌似神 ...

  8. Monte Carlo方法简介(转载)

    Monte Carlo方法简介(转载)       今天向大家介绍一下我现在主要做的这个东东. Monte Carlo方法又称为随机抽样技巧或统计实验方法,属于计算数学的一个分支,它是在上世纪四十年代 ...

  9. 蒙特·卡罗算法的Python实现

    一 背景 此算法诞生的背景是: 曼哈顿计划,有极大的计算需求. 计算机刚开始发展,最适合做计算. 蒙特卡洛算法理论基础是概率论,实际就是暴力计算逼近理想结果.正是在以上两个背景下,它刚好得到了极大的应 ...

随机推荐

  1. $Java设计模式之——观察者模式(Observer)

    (一)观察者模式简介 1.定义:定义对象间一种一对多的依赖关系,一个对象状态发生改变时,所有依赖它的对象都会接到通知并作出相应的响应. 2.应用场景: (1)GUI系统 (2)订阅-发布系统 (3)事 ...

  2. excel中如何取消自动超链接?

    最近做的表格有点多,年终述职也到了.总有一些地方生疏了,幸好还有点小印象.记录下来,以后可以回来看看. 方法一 适合单个链接的取消 1 输入网址后,按回车键确认,快捷键ctrl+z,即可取消,这种不好 ...

  3. STM32探秘 之FSMC

    源:STM32探秘 之FSMC STM32 FSMC总线深入研究

  4. UCOS2_STM32F1移植详细过程

    源:UCOS2_STM32F1移植详细过程(三) UCOS2_STM32移植过程.系统内核.事件描述(汇总)

  5. delphi 中 unicode 转汉字 函数

    近期用到这个函数,无奈没有找到 delphi 自带的,网上找了下 有类似的,没有现成的,我需要的是 支持 “\u4f00 ” 这种格式的,即前面带标准的 “\u”  于是改造了一下. 下面是 解码 函 ...

  6. Struts2笔记04——Hello World Example(转)

    原文地址:https://www.tutorialspoint.com/struts_2/ [注释]项目结构,次序估计有误 通过学习Struts2的架构,我们可以知道,在Struts2 web应用中, ...

  7. Java变量修饰符volatile

    volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...

  8. @MarkFan 口语练习录音 20140423 [风雨哈佛路.Homeless To Harvard口语录音]

    世界在转动,你只是一粒尘埃 没有你,世界照样在转 现实不会按照你的意识去改变的 一些人的需求 一些人的意志要比你更强 严酷的生活会让人不知所措 所以他们久久地困在挫败中 我们生气地抱怨,而对整体的形势 ...

  9. linux+java+webdriver chrome handless无界面启动

    网上现有的解决方案要么是windows下的,要么是python的,搞了一天终于解决了,记录如下. 1 下载chrome linux版和对应版本的webdriver,我这里使用的是chrome66和ch ...

  10. INSPIRED启示录 读书笔记 - 第37章 大众网络服务产品

    十大要点 1.可用性:大众网络服务产品必须具备良好的用户体验 2.人物角色:按典型特征将用户分类,抽象出有代表性的用户类型(人物角色) 3.扩展性:应该不间断地考虑扩展性问题,永远留有余地,不到万不得 ...