点分治+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的更多相关文章

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

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

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

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

  3. [luoguP3729]曼哈顿计划EX

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

  4. [Luogu3727]曼哈顿计划E

    luogu 题意(简化版) 给你一棵树,每个点上有一个\(SG\)值,问你是否存在一条路径使得\(SG\)异或和为\(0\). sol 可以当做每个点的稳定值就是这个点上的石子数量. 很显然我们只需要 ...

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

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

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

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

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

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

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

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

  9. 随机采样方法整理与讲解(MCMC、Gibbs Sampling等)

    本文是对参考资料中多篇关于sampling的内容进行总结+搬运,方便以后自己翻阅.其实参考资料中的资料写的比我好,大家可以看一下!好东西多分享!PRML的第11章也是sampling,有时间后面写到P ...

随机推荐

  1. JavaScript(四):运算符&数据类型转换

    +:算符的加法:连接字符串 加法会将其它类型的值,自动转为字符串,然后再进行连接运算! var a=1+2; console.log('first: '+a); var a=1+2+'3';//先计算 ...

  2. Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现

    https://blog.csdn.net/zouxy09/article/details/9993371 自己平时看了一些论文,但老感觉看完过后就会慢慢的淡忘,某一天重新拾起来的时候又好像没有看过一 ...

  3. Sql server 存储过程批量插入若干数据。

    测试时,经常需要生成大量数据来测试系统性能,此功能可以用存储过程快速生成. 1. 随机生成日期 DECLARE @Date_start datetime DECLARE @Date_end datet ...

  4. sqlmap的使用

    安全测试===sqlmap(壹)转载   六.优化 这些参数可以优化Sqlmap的性能. 1.一键优化 参数:-o 添加此参数相当于同时添加下列三个优化参数: --keep-alive --null- ...

  5. Presto 学习和使用笔记

    1.presto 表连接查询的连接条件中不支持使用函数 比如下面的脚本在presto中运行会报错 select t1.period_start_date, t2.statistic_date from ...

  6. HDU 2175 汉诺塔IX (递推)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2175 1,2,...,n表示n个盘子.数字大盘子就大.n个盘子放在第1根柱子上.大盘不能放在小盘上.  ...

  7. 教你如何修改CentOS系统上的时间

    直接看命令:

  8. <转>jmeter(九)逻辑控制器

    本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...

  9. Java学习路线教程之JDBC基本操作

    为了帮助大家熟练应用JDBC编程,接下来,在本节将通过一个综合案例来讲解JDBC的基本操作,确保大家能够深刻理解JDBC的增.删.改.查,灵活利用JDBC完成对数据库的各项操作. 1. 创建一个Jav ...

  10. GoldenGate实时投递数据到大数据平台(1)-MongoDB

    mongodb安装 安装 linux下可使用apt-get install mongodb-server 或 yum install mongodb-server 进行安装. 也可以在windows上 ...