#阶梯NIM,树形dp#CF1498F Christmas Game
题目
Alice 和 Bob 在一棵 \(n\) 个点的树上玩游戏,第 \(i\) 个节点上有 \(a_i\) 个石子,
每轮可以选择一个深度至少为 \(k\) 的节点并移动任意多石子到其 \(k\) 级祖先处,对每个结点询问如果将其作为根谁会赢。
分析
设\(dp[x][d]\)表示以 \(x\) 为根的子树离\(x\)的距离\(\bmod 2k\) 为 \(d\) 的SG值
由于先手移动偶数层后手可以用同样的方式移上去所以只需要考虑奇数层的SG值,
直接二次扫描换根即可
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=100011; struct node{int y,next;}e[N<<1];
int dp[N][40],n,m,ans[N],a[N],et=1,as[N],f[40];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void dfs1(int x,int fa){
dp[x][0]=a[x];
for (rr int i=as[x];i;i=e[i].next)
if (e[i].y!=fa){
dfs1(e[i].y,x);
for (rr int j=0;j<m;++j)
dp[x][(j+1)%m]^=dp[e[i].y][j];
}
}
inline void dfs2(int x,int fa){
if (fa){
for (rr int j=0;j<m;++j) f[(j+1)%m]=dp[fa][(j+1)%m]^dp[x][j];
for (rr int j=0;j<m;++j) dp[x][(j+1)%m]^=f[j];
}
for (rr int i=as[x];i;i=e[i].next)
if (e[i].y!=fa) dfs2(e[i].y,x);
}
signed main(){
n=iut(),m=iut()<<1;
for (rr int i=1;i<n;++i){
rr int x=iut(),y=iut();
e[++et]=(node){y,as[x]},as[x]=et;
e[++et]=(node){x,as[y]},as[y]=et;
}
for (rr int i=1;i<=n;++i) a[i]=iut();
dfs1(1,0),dfs2(1,0);
for (rr int i=1;i<=n;++i){
for (rr int j=m/2;j<m;++j) ans[i]^=dp[i][j];
putchar((ans[i]>0)+48),putchar(32);
}
return 0;
}
#阶梯NIM,树形dp#CF1498F Christmas Game的更多相关文章
- [SDOI2019]移动金币(博弈论+阶梯Nim+按位DP)
首先可以把问题转化一下:m堆石子,一共石子数不超过(n-m)颗,每次可以将一堆中一些石子推向前一堆,无法操作则失败,问有多少种方法使得先手必胜? 然后这个显然是个阶梯Nim,然后有这样的结论:奇数层异 ...
- Atcoder #014 agc014_D 树形DP+nim变形
LINK 题意:两人在一颗树上做游戏,先手可以将树上一个节点染白,后手染黑,到最后时,所有与黑色相邻的白色同时变黑.如果还存在白色,先手胜,否则后手胜. 思路:首先不考虑树上,单独为链时,不管找规律也 ...
- Codeforces Round #384 (Div. 2)D - Chloe and pleasant prizes 树形dp
D - Chloe and pleasant prizes 链接 http://codeforces.com/contest/743/problem/D 题面 Generous sponsors of ...
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- 【BZOJ-4726】Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
- 树形DP
切题ing!!!!! HDU 2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...
- BZOJ 2286 消耗战 (虚树+树形DP)
给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...
- POJ2342 树形dp
原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...
随机推荐
- 负载均衡load balancing和算法分类概要介绍
一.负载均衡介绍 1.1 什么是负载均衡 负载均衡(load balancing) 它是计算机的一种技术,用来在计算机集群.网络连接.CPU.磁盘驱动器或其他资源中分配负载,以达到优化资源使用.最大化 ...
- Jetpack Compose(2) —— 入门实践
一.项目中使用 Jetpack Compose 从此节开始,为方便起见,如无特殊说明,Compose 均指代 Jetpack Compose. 开发工具: Android Studio 1.1 创建支 ...
- Centos8上安装Redis5.X
一.下载Redis 下载地址:wget http://download.redis.io/releases/redis-5.0.7.tar.gz 解压:tar -xzvf redis-5.0.7.ta ...
- 【Azure 存储服务】如何查看Storage Account的删除记录,有没有接口可以下载近1天删除的Blob文件信息呢?
问题描述 如何查看Storage Account的删除记录,有没有接口可以下载近1天删除的Blob文件信息呢?因为有时候出现误操作删除了某些Blob文件,想通过查看删除日志来定位被删除的文件信息. 问 ...
- 2024年,提升Windows开发和使用体验实践 - 小工具篇
前言 本来是一篇文章的,不知不觉写成了系列. 其实开工那几天就已经写好了长文,这几天一忙就没连着发了. 本文介绍一些 Windows 上用的小工具. 美化/折腾/小工具 虽然这是在用 Windows ...
- 【简历模板】极简Markdown程序员简历模板
前言 最近在找工作,一份好的简历是敲门砖,所以跟大家分享下简洁明了大方MarkDown的简历模板和在线编辑工具 在线工具 冷熊 Java工程师简历模板 下载 点击下载 预览 个人信息 xxx/男/19 ...
- SpringCloud Sentinel使用
1. 简介 Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流.流量整形.熔断降级.系统负载保护.热点防护等多个维度来帮助开发者保障微服务的稳定性.替换原先Hystrix ...
- Java 关于抽象类匿名子类
1 package com.bytezreo.abstractTest; 2 3 /** 4 * 5 * @Description Abstract 关键字使用 6 * @author Bytezer ...
- ReentrantLock原理CAS+AQS队列
ReentrantLock主要利用CAS+AQS队列来实现.它支持公平锁和非公平锁,两者的实现类似. CAS:Compare and Swap,比较并交换.CAS有3个操作数:内存值V.预期值A.要修 ...
- 阿里巴巴/1688 api接口 获取商品详情 数据采集
iDataRiver平台 https://www.idatariver.com/zh-cn/ 提供开箱即用的阿里巴巴1688电商数据采集API,供用户按需调用. 接口使用详情请参考阿里巴巴1688接口 ...