牛客练习赛63 F.牛牛的树行棋(启发式合并+sg打表)
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打表)相关推荐
- 牛客练习赛63 F.牛牛的树行棋(博弈 SG函数)
题目链接:https://ac.nowcoder.com/acm/contest/5531/F 牛牛的树行棋 前置知识 思路 代码 前置知识 这道题目需要博弈论中的SG函数的知识,这里就不多赘述.主要 ...
- 牛客练习赛63 F 牛牛的树行棋 (SG函数+树差分)
链接:https://ac.nowcoder.com/acm/contest/5531/F 来源:牛客网 牛牛的树行棋 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K, ...
- 牛客练习赛63 C.牛牛的揠苗助长
牛客练习赛63 C.牛牛的揠苗助长 题目链接 题目描述 牛牛有一块长度大小为n的菜园,他首先对这块菜园从1到n进行了编号,每一块地分别为1号.2号-n号菜地,然后他往每块菜地中都种下了一些水稻,一开始 ...
- 解题报告 - 牛客练习赛63 C - 牛牛的揠苗助长(货仓选址+二分)
链接:https://ac.nowcoder.com/acm/contest/5531/C 来源:牛客网 题目描述 牛牛有一块长度大小为n的菜园,他首先对这块菜园从1到n进行了编号,每一块地分别为1号 ...
- 牛客练习赛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 ...
- 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 牛客练习赛68 B.牛牛的算术
牛客练习赛68 B.牛牛的算术 题目链接 题目描述 牛牛最近学习了取模是什么 于是他看到了下面这一道题: 多次询问:每次询问包含一个正整数 n 要求你输出下列结果 ∏i=1n∑j=1i∑k=1ji×j ...
- 牛客练习赛68 A.牛牛的mex
牛客练习赛68 A.牛牛的mex 题目链接 题目描述 牛牛现在有一个长度为 nnn 的序列 a1,a2,-,ana_1,a_2,\ldots,a_na1,a2,-,an.现在牛牛有 qqq 次询 ...
- 牛客练习赛 63 F-牛牛的树行棋
F-牛牛的树行棋 大佬题解 对于每一个棋子来说,都是独立的,因此当前局面的 SG 值就是每一枚棋子的 SG 值的异或和.若一枚棋子的往子树内最多可以走 kkk 步,它的 SG 值为 kkk.然后就可以 ...
最新文章
- java ssl证书生成_java – 使用jdk中提供的keytool生成SSL证书
- Ubuntu的网络设置
- 7.1.2 定义改进的Sales_date类
- error when defining a rule - SAP loyalty management的积分定义规则
- 蓝牙:为啥叫“蓝”牙,不叫“白”牙?
- Android studio实现底部导航,AndroidStudio制作底部导航栏以及用Fragment实现切换功能...
- mssql 数据库审计账户_SQLServer数据库审计功能入门之SQL Server审核 (SQL Server Audit)...
- kafka可视化客户端工具(Kafka Tool)的使用
- 业余学习python有用吗_对于那些不做编程工作的小伙伴来说,学习Python有什么用呢?...
- mysql三阶段提交实现_基于两阶段提交的分布式事务实现(UP-2PC)
- a59s刷机包卡刷 oppo_OPPOA59S刷机包_线刷包_救砖包_官方ROM包_固件包下载- 线刷宝ROM中心...
- java判断是否微信浏览器_Java判断浏览器是微信还是支付宝
- Android Studio课堂总结05
- 【VS开发】免费打工仔:一个完善的ActiveX Web控件教程
- 拼多多登录一直连接服务器,拼多多有自己的服务器吗
- 计算机的宽带用户名没有了怎么办,电脑没办法建立宽带连接怎么办
- python绘制特洛伊小行星群
- Ajax请求成功却执行error回调方法(Ajax跨域请求问题)
- 攻防世界-江苏工匠杯
- 零零散散之Java异常