LINK

假设只有一枚棋子,那么这枚棋子在叶子节点的 s g sg sg值显然是零

其他节点可以 s g sg sg打表推出来,由于只需要子树内的 s g sg sg值,似乎需要用到启发式合并计算

但是我们发现叶子节点是 s g sg sg是零,说明叶子节点的父亲至少是 1 1 1…一个点的 s g sg sg值取决与子树内深度最大的叶子节点

于是可以 O ( n ) O(n) O(n)直接先算出来

现在求先手第一步也多少种方案移动使得先手必胜

也就是移动完之后 s g sg sg值需要变成零

如果节点 x x x的 s g sg sg值是 s g [ x ] sg[x] sg[x],当前总的 s g sg sg值是 k k k

那么需要满足 k ⊕ s g [ x ] ⊕ n o w = 0 k\oplus sg[x] \oplus now=0 k⊕sg[x]⊕now=0

n o w = k ⊕ s g [ x ] now=k\oplus sg[x] now=k⊕sg[x]

统计子树内有多少这个就可以了,启发式合并即可

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
struct edge{int to,nxt;
}d[maxn]; int head[maxn],cnt=1;
void add(int u,int v){ d[++cnt] = (edge){v,head[u]},head[u] = cnt; }
int siz[maxn],son[maxn],n,m,deep[maxn],sg[maxn],sum;
void dfs(int u,int fa)
{siz[u] = 1; deep[u] = deep[fa]+1;for(int i=head[u];i;i=d[i].nxt ){int v = d[i].to;if( v==fa )  continue;dfs(v,u); siz[u] += siz[v];sg[u] = max( sg[u],deep[v]-deep[u] );if( siz[v]>siz[son[u]] ) son[u] = v;}sum ^= sg[u];
}
int SON,c[maxn],ans;
void calc(int u,int fa,int val)
{c[sg[u]] += val;for(int i=head[u];i;i=d[i].nxt ){int v = d[i].to;if( v==fa||v==SON )  continue;calc(v,u,val);}
}
void dsu(int u,int fa,int keep)
{for(int i=head[u];i;i=d[i].nxt ){int v = d[i].to;if( v!=fa&&v!=son[u] )   dsu(v,u,0);//不保留 }if( son[u] )  dsu(son[u],u,1),SON = son[u];//保留calc(u,fa,1); ans += ( c[sum^sg[u]] ); SON = 0;if( !keep ) calc(u,fa,-1);
}
int main()
{cin >> n;for(int i=1;i<n;i++){int l,r; scanf("%d%d",&l,&r);add(l,r); add(r,l);}dfs(1,0);     dsu(1,0,1);if( ans )    cout << "YES\n" << ans;else   cout << "NO";
}

牛客练习赛63 F.牛牛的树行棋(启发式合并+sg打表)相关推荐

  1. 牛客练习赛63 F.牛牛的树行棋(博弈 SG函数)

    题目链接:https://ac.nowcoder.com/acm/contest/5531/F 牛牛的树行棋 前置知识 思路 代码 前置知识 这道题目需要博弈论中的SG函数的知识,这里就不多赘述.主要 ...

  2. 牛客练习赛63 F 牛牛的树行棋 (SG函数+树差分)

    链接:https://ac.nowcoder.com/acm/contest/5531/F 来源:牛客网 牛牛的树行棋 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K, ...

  3. 牛客练习赛63 C.牛牛的揠苗助长

    牛客练习赛63 C.牛牛的揠苗助长 题目链接 题目描述 牛牛有一块长度大小为n的菜园,他首先对这块菜园从1到n进行了编号,每一块地分别为1号.2号-n号菜地,然后他往每块菜地中都种下了一些水稻,一开始 ...

  4. 解题报告 - 牛客练习赛63 C - 牛牛的揠苗助长(货仓选址+二分)

    链接:https://ac.nowcoder.com/acm/contest/5531/C 来源:牛客网 题目描述 牛牛有一块长度大小为n的菜园,他首先对这块菜园从1到n进行了编号,每一块地分别为1号 ...

  5. 牛客练习赛63 B 牛牛的鱼缸

    分类讨论即可: AC代码: int main() {int t;int l, h;int L, H;sdd(h, l);sdd(H, L);double ans, x;x = (H * l * 1.0 ...

  6. 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  7. 牛客练习赛68 B.牛牛的算术

    牛客练习赛68 B.牛牛的算术 题目链接 题目描述 牛牛最近学习了取模是什么 于是他看到了下面这一道题: 多次询问:每次询问包含一个正整数 n 要求你输出下列结果 ∏i=1n∑j=1i∑k=1ji×j ...

  8. 牛客练习赛68 A.牛牛的mex

    牛客练习赛68 A.牛牛的mex 题目链接 题目描述 牛牛现在有一个长度为 nnn 的序列 a1,a2,-,ana_1,a_2,\ldots,a_na1​,a2​,-,an​.现在牛牛有 qqq 次询 ...

  9. 牛客练习赛 63 F-牛牛的树行棋

    F-牛牛的树行棋 大佬题解 对于每一个棋子来说,都是独立的,因此当前局面的 SG 值就是每一枚棋子的 SG 值的异或和.若一枚棋子的往子树内最多可以走 kkk 步,它的 SG 值为 kkk.然后就可以 ...

最新文章

  1. java ssl证书生成_java – 使用jdk中提供的keytool生成SSL证书
  2. Ubuntu的网络设置
  3. 7.1.2 定义改进的Sales_date类
  4. error when defining a rule - SAP loyalty management的积分定义规则
  5. 蓝牙:为啥叫“蓝”牙,不叫“白”牙?
  6. Android studio实现底部导航,AndroidStudio制作底部导航栏以及用Fragment实现切换功能...
  7. mssql 数据库审计账户_SQLServer数据库审计功能入门之SQL Server审核 (SQL Server Audit)...
  8. kafka可视化客户端工具(Kafka Tool)的使用
  9. 业余学习python有用吗_对于那些不做编程工作的小伙伴来说,学习Python有什么用呢?...
  10. mysql三阶段提交实现_基于两阶段提交的分布式事务实现(UP-2PC)
  11. a59s刷机包卡刷 oppo_OPPOA59S刷机包_线刷包_救砖包_官方ROM包_固件包下载- 线刷宝ROM中心...
  12. java判断是否微信浏览器_Java判断浏览器是微信还是支付宝
  13. Android Studio课堂总结05
  14. 【VS开发】免费打工仔:一个完善的ActiveX Web控件教程
  15. 拼多多登录一直连接服务器,拼多多有自己的服务器吗
  16. 计算机的宽带用户名没有了怎么办,电脑没办法建立宽带连接怎么办
  17. python绘制特洛伊小行星群
  18. Ajax请求成功却执行error回调方法(Ajax跨域请求问题)
  19. 攻防世界-江苏工匠杯
  20. 零零散散之Java异常

热门文章

  1. 小程序日活500,收入多少,怎么赚钱把服务器费用赚回来啊~
  2. shell screen
  3. wp/wordpress主题开发注册默认必备菜单
  4. Android OMX
  5. 【敏捷个人俱乐部】QQ群第二次公开接受加入 及 12月4日晚上聊天记录
  6. MySQL数据库无法打开 用户不存在 快速的解决方法
  7. ButterKnife Zelezny使用
  8. 脚手架架构设计和框架搭建 - 框架搭建
  9. NeuralRecon拜读:单目视频实时连贯三维重建
  10. javaweb基础知识(一) + webapp制作