设$f[x]$为$x$子树里的子游戏的sg值,$h[x]$为$x$所有儿子节点$f[x]$的异或和,则:

$f[x]=mex(y到x路径上所有点的h的异或和\ xor\ y到x路径上所有点的f的异或和)$,$y$是$x$子树中的一个白点。

考虑一个白点对其祖先的影响,可以发现每往上走一步,一个子树里的贡献将会异或上一个相同的数。

用Trie来维护每个点子树里所有白点的贡献,需要支持合并操作、mex的查询,以及一个异或的标记,下传时交换左右儿子。

时间复杂度$O(n\log n)$。

#include<cstdio>
const int N=100010,M=4000000;
int n,m,i,x,y,a[N],g[N],v[N<<1],nxt[N<<1],ed,f[N],h[N];
int l[M],r[M],tag[M],T[N],tot;bool val[M],fin[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
inline void rev(int d,int p,int x){
if(!x||d<0)return;
tag[x]^=p;
if(p>>d&1){int t=l[x];l[x]=r[x];r[x]=t;}
}
inline void pb(int d,int x){if(tag[x])rev(d-1,tag[x],l[x]),rev(d-1,tag[x],r[x]),tag[x]=0;}
int build(int d,int p){
int x=++tot;
if(d<0)return val[x]=1,x;
if(p>>d&1)r[x]=build(d-1,p);else l[x]=build(d-1,p);
return x;
}
int merge(int d,int p,int x,int y){
if(!y)return x;
if(!x){
rev(d,p,y);
return y;
}
int z=++tot;
if(d<0)return val[z]=1,z;
pb(d,x),pb(d,y);
if(p>>d&1)l[z]=merge(d-1,p,l[x],r[y]),r[z]=merge(d-1,p,r[x],l[y]);
else l[z]=merge(d-1,p,l[x],l[y]),r[z]=merge(d-1,p,r[x],r[y]);
return val[z]=val[l[z]]&val[r[z]],z;
}
inline int mex(int x){
int t=0;
for(int i=m;~i;i--){
pb(i,x);
if(!val[l[x]])x=l[x];else x=r[x],t|=1<<i;
}
return t;
}
void dfs(int x,int y){
for(int i=g[x];i;i=nxt[i])if(v[i]!=y)dfs(v[i],x),h[x]^=f[v[i]];
if(!a[x])T[x]=build(m,h[x]);
for(int i=g[x];i;i=nxt[i])if(v[i]!=y)T[x]=merge(m,h[x]^f[v[i]],T[x],T[v[i]]);
f[x]=mex(T[x]);
}
void cal(int x,int y,int z){
z^=f[x]^h[x];
if(!a[x]&&!z)fin[x]=1;
for(int i=g[x];i;i=nxt[i])if(v[i]!=y)cal(v[i],x,z);
}
int main(){
for(read(n),i=1;i<=n;i++)read(a[i]);
for(i=1;i<n;i++)read(x),read(y),add(x,y),add(y,x);
while((1<<m)<=n)m++;m--;
dfs(1,0);
if(!f[1])return puts("-1"),0;
for(cal(i=1,0,f[1]);i<=n;i++)if(fin[i])printf("%d\n",i);
return 0;
}

  

BZOJ4134 : ljw和lzr的hack比赛的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. Kaggle 自行车租赁预测比赛项目实现

    作者:大树 更新时间:01.20 email:59888745@qq.com 数据处理,机器学习 回主目录:2017 年学习记录和总结 .caret, .dropup > .btn > . ...

  3. BestCoder Round #92 比赛记录

    上午考完试后看到了晚上的BestCoder比赛,全机房都来参加 感觉压力好大啊QAQ,要被虐了. 7:00 比赛开始了,迅速点进了T1 大呼这好水啊!告诉了同桌怎么看中文题面 然后就开始码码码,4分1 ...

  4. Zepto Code Rush 2014-A. Feed with Candy(HACK)

    A. Feed with Candy time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  5. codeforces hack

    对某一题,首先你自己要先过TEST. 然后回到比赛的PROBLEM列表,把这题后面的锁锁上(锁上了就不能再提交了,所以没把握就别锁了), 然后到ROOM里面,你就可以看别人代码了,下面有HACK按钮, ...

  6. ACM-ICPC 训练平台 & 比赛 分析

    the file can download in https://pan.baidu.com/s/1HwoLFHGAG-boQbIn9xIhxA occ5 the article is also pu ...

  7. css常用hack

    原文地址:css常用hack 突然想起今天早上在CNZZ看到的统计数据,使用IE6.7的用户比例还真多,看到之后我的心都碎了.微软都放弃了为毛还有这么多人不死心? 所以说,IE下的兼容还是得做的. – ...

  8. Livecoding.tv 现正举行iOS及Android App设计比赛

    近日,Livecoding.tv, 一个为世界各地的程序员提供在线实时交流的平台,在其网站上发布了一篇通知, 宣布从4月15日至5月15日,会为iOS和Android的开发者举办一场本地移动app设计 ...

  9. CSS3_01之选择器、Hack

    1.兄弟选择器:①相邻兄弟选择器:元素的后一个兄弟元素,选择器1+选择器2:②通用兄弟选择器:元素后的所有兄弟元素,选择器1~选择器2: 2.属性选择器:attr表示属性名称,elem表示元素名:①[ ...

随机推荐

  1. node.js模拟qq漂流瓶

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) node.js模拟简易漂流瓶,页面有扔瓶子和捡瓶子的功能,一个瓶子只能被捡到一次,阅读完就置状态位, ...

  2. 序列GCD和问题(题目)

    序列GCD和 题目描述 Massacc有一个序列$A_1,A_2,A_3,\dots ,A_n$. Popbab说:我要知道这个序列的和$\pmod{1\times10^9+7}$. Massacc在 ...

  3. Properties类一些常用的用法

    直接上代码: package test.properties; import java.io.File; import java.io.FileInputStream; import java.io. ...

  4. MySQL数据丢失情况分析

    一.存储引擎层面丢失数据                                                       由于在实际项目中,我们往往使用支持事务的InnoDB存储引擎.我们 ...

  5. Java for LeetCode 062 Unique Paths

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...

  6. 实现dom元素拖动

    本文主要写一下如何实现dom元素拖动,目前使用jquery库实现之. 主要的注释附在代码中,大家可以根据代码画一个小的窗口模型图,以便于理解. <!DOCTYPE html> <ht ...

  7. cf112a(水题)

    题目很简单..不过题意好像有点难懂... 题意:判定一个数能否被一个幸运数整除,循环一遍4到n/4,若存在i为幸运数且被n整除输出yes,反之输出no... 代码如下: #include <bi ...

  8. Java之IO操作总结

    所谓IO,也就是Input与Output的缩写.在java中,IO涉及的范围比较大,这里主要讨论针对文件内容的读写 其他知识点将放置后续章节 对于文件内容的操作主要分为两大类 分别是: 字符流 字节流 ...

  9. Quartus signal tapii 的使用

    此功能原来已经试验过,没有笔记.这次复习巩固下. 使用PLL 的程序. 1.新建signaltap ii 文件 注意以下几个地方,会用到 添加采样时钟 . 添加采样信号: 完成之后,编译下载 运行 两 ...

  10. 有哪些关于 Android 开发的博客值得订阅?

    链接:http://www.zhihu.com/question/19788650/answer/60771437来源:知乎 Google 官方[Android Developers Blog](An ...