小奇的仓库:换根dp
一道很好的换根dp题。考场上现场yy十分愉快
给定树,求每个点的到其它所有点的距离异或上m之后的值,n=100000,m<=16
只能线性复杂度求解,m又小得奇怪。或者带一个log像kx一样打一个线段树
我们可以发现,m小的话对距离很大的路径的影响也不会超过16。
那么变化的其实就是最后4个二进制位啊。
所以我们像普通的换根dp一样求出所有距离,在额外处理一下以p为端点的全部路径里路径长度%16之后的值为k的有多少个
设为bits2[k][p]
因为换根dp的主要思路是两遍dfs,第一次处理每个点的子树,第二遍处理以这个点为端点的所有点对的状态
设子树里所有的点到当前根节点的距离是dt[p],子树所有点到当前根节点的路径%16之后值为k的路径有k个设为bits[k][p]
那么第一轮dfs转移还是很显然的,我稍微说一下第二轮。
dt[p]=dt[p]+dt[f[p]]-(dt[p]+siz[p]*vtf[p])+vtf[p]*(n-siz[p]);其中vtf[p]表示p节点到其父亲的距离
=p的子树里所有点到p的距离+所有点到p的父亲的距离-(p子树内的点到p的距离+这些点从p再到p父亲的距离)+子树p外的所有点从p父亲到p的距离
两个公式的每个部分都是对应的
那么bits数组的转移也是大同小异了(虽说稍复杂一些)
for(int j=;j<=;++j) bits2[j+vtf[p]&][p]=bits[j+vtf[p]&][p]+bits2[j][f[p]]-bits[j-vtf[p]+&][p];
首先是子树里本身就有bits[j+vtf[p]&]个点满足条件
到父亲的距离为j的所有点里去除子树p里的贡献就是bits2[j][f[p]]-bits[j-vtf[p]+&][p]
自己想?
容易重复考虑自己到自己的距离为0而异或后不是0的情况,要减去m
具体实现细节自己想?有什么不会的评论区吧,我扔个代码就跑~
//这个异或是个狗屎啊!!!但是其实异或的二进制位也不超过4,特殊处理一下?
//对于每一个节点计算出子树所有点到它的距离和,再计算出有多少点到它的距离&15后是几
#include<cstdio>
#define int long long
int n,m,cnt,fir[],l[],to[],v[],dt[],siz[];
int bits[][],f[],vtf[],bits2[][];
void dfs(int p,int fa){
siz[p]=; bits[][p]=; f[p]=fa;
for(int i=fir[p];i;i=l[i])if(to[i]!=fa){
dfs(to[i],p); siz[p]+=siz[to[i]]; dt[p]+=dt[to[i]]+siz[to[i]]*v[i]; vtf[to[i]]=v[i];
for(int j=;j<=;++j) bits[j+v[i]&][p]+=bits[j][to[i]];
}
}
void DFS(int p){
if(p!=){
dt[p]+=dt[f[p]]-(dt[p]+siz[p]*vtf[p])+vtf[p]*(n-siz[p]);
for(int j=;j<=;++j) bits2[j+vtf[p]&][p]=bits[j+vtf[p]&][p]+bits2[j][f[p]]-bits[j-vtf[p]+&][p];
}else for(int j=;j<=;++j)bits2[j][]=bits[j][];
for(int i=fir[p];i;i=l[i]) if(to[i]!=f[p]) DFS(to[i]);
}
void link(int a,int b,int vv){l[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;v[cnt]=vv;}
signed main(){//freopen("newt3.in","r",stdin);freopen("newcot3.out","w",stdout);
scanf("%lld%lld",&n,&m);
for(int i=,x,y,ww;i<n;++i)scanf("%lld%lld%lld",&x,&y,&ww),link(x,y,ww),link(y,x,ww);
dfs(,);DFS();//for(int i=1;i<=n;++i)printf("%lld\n",dt[i]);
for(int i=;i<=n;++i){int ans=dt[i];for(int j=;j<=;++j)ans+=bits2[j][i]*((j^m)-j);printf("%lld\n",ans-m);}
}
小奇的仓库:换根dp的更多相关文章
- 小奇的仓库(树形DP)
「题目背景」 小奇采的矿实在太多了,它准备在喵星系建个矿石仓库.令它无语的是,喵星系的货运飞船引擎还停留在上元时代! 「问题描述」 喵星系有n个星球,星球以及星球间的航线形成一棵树. 从星球a到星球b ...
- nowcoder 79F 小H和圣诞树 换根 DP + 根号分治
设节点个数大于 $\sqrt n$ 的颜色为关键颜色,那么可以证明关键颜色最多有 $\sqrt n$ 个.对于每个关键颜色,暴力预处理出该颜色到查询中另一个颜色的距离和. 对于不是关键颜色的询问,直接 ...
- 【换根DP】小奇的仓库
题目背景 小奇采的矿实在太多了,它准备在喵星系建个矿石仓库.令它无语的是,喵星系的货运飞船引擎还停留在上元时代! 题目内容 喵星系有\(n\)个星球,星球以及星球间的航线形成一棵树. 从星球\(a\) ...
- 换根DP+树的直径【洛谷P3761】 [TJOI2017]城市
P3761 [TJOI2017]城市 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有ri座城市,<-1条高速公路,保证了任意两运城市之间都可以通过高速公 ...
- 洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP
洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP 题目描述 著名的电子产品品牌\(SHOI\) 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米 ...
- [BZOJ4379][POI2015]Modernizacja autostrady[树的直径+换根dp]
题意 给定一棵 \(n\) 个节点的树,可以断掉一条边再连接任意两个点,询问新构成的树的直径的最小和最大值. \(n\leq 5\times 10^5\) . 分析 记断掉一条边之后两棵树的直径为 \ ...
- 2018.10.15 NOIP训练 水流成河(换根dp)
传送门 换根dp入门题. 貌似李煜东的书上讲过? 不记得了. 先推出以1为根时的答案. 然后考虑向儿子转移. 我们记f[p]f[p]f[p]表示原树中以ppp为根的子树的答案. g[p]g[p]g[p ...
- 国家集训队 Crash 的文明世界(第二类斯特林数+换根dp)
题意 题目链接:https://www.luogu.org/problem/P4827 给定一棵 \(n\) 个节点的树和一个常数 \(k\) ,对于树上的每一个节点 \(i\) ,求出 \( ...
- Acesrc and Travel(2019年杭电多校第八场06+HDU6662+换根dp)
题目链接 传送门 题意 两个绝顶聪明的人在树上玩博弈,规则是轮流选择下一个要到达的点,每达到一个点时,先手和后手分别获得\(a_i,b_i\)(到达这个点时两个人都会获得)的权值,已经经过的点无法再次 ...
随机推荐
- 你的环境有问题吧?--byte数组转字符串的疑惑
1. 故事背景 小T是个测试MM,小C是个程序猿,今天早上他们又为一个bug吵架了. 小T:“这个显示是bug,在我的浏览器上显示不正确” 小C:“这个bug我不认,在我的电脑上显示正常,是你的环境有 ...
- Python3 学习笔记之 变量/字符串/if/while/逻辑运算符/模块引用
变量/if/while/逻辑运算符/模块引用: 变量: 使用变量前必须先赋值. 大小写区分. Python创建字符串,在字符串两边可以加上单引号或者双引号. 打印单引号或双引号,使用转移\ 使用\进行 ...
- 浅谈个人对客户端JavaScript同步、异步、执行顺序等概念的理解
一.同步和异步的概念. 同步:即按代码的顺序执行任务. 在下列代码中,按照同步概念,则是先打印1后打印2. console.log(1); console.log(2); 异步:即执行一个任务的同时执 ...
- 转:python2.x 和 python3.x的区别
注:本文的原文地址为Key differences between Python 2.7.x and Python 3.x 许多 Python 初学者想知道他们应该从 Python 的哪个版本开始学习 ...
- BZOJ 4621: Tc605
Description 最初你有一个长度为 N 的数字序列 A.为了方便起见,序列 A 是一个排列. 你可以操作最多 K 次.每一次操作你可以先选定一个 A 的一个子串,然后将这个子串的数字全部变成原 ...
- 利用pyecharts将数据可视化
可视化展示在数据分析领域中是一个至关重要的点,好的可视化展示对我们的结果分析有更好的支持作用. 一.问题 在数据分析的时代里面我们需要将数据的可视化展现出来,更加方便用户的观察.如下图 有些时候我们需 ...
- 【EasyCi】持续集成交付,一键式自动化部署系统,开箱即用
前言 本人是一家互联网公司的java开发,由于公司初期公司未招运维人员,恰好我对linux比较熟悉,便在公司服务器搭建了一套Jenkins.Gitlab.Maven私服.Docker私服.Sonarq ...
- 深入了解一下HTTP缓存机制
HTTP 缓存机制作为 web 性能优化的重要手段,是Web 开发知识体系库中的一个基础环节,但是对于很多学习者来说,仅仅只是知道浏览器会对请求的静态文件进行缓存,但是为什么被缓存,缓存是怎样生效的, ...
- opencv::积分图计算
利用积分图像,可以计算在某象素的上-右方的或者旋转的矩形区域中进行求和.求均值以及标准方差的计算,并且保证运算的复杂度为O(). #include <opencv2/opencv.hpp> ...
- Centos7.4环境下搭建Python开发环境(虚拟机安装+python安装+pycharm安装)
目录 一.安装 Centos7.4虚拟机 二.安装 python3.6.7 三.安装 pycharm 一般情况下,大家都是在 Windows平台下进行 Python开发,软件安装和环境搭建都非常&qu ...