[CSP-S模拟测试]:小奇的仓库(warehouse)(树形DP)
题目背景
小奇采的矿实在太多了,它准备在喵星系建个矿石仓库。令它无语的是,喵星系的货运飞船引擎还停留在上元时代!
题目描述
喵星系有$n$个星球,星球以及星球间的航线形成一棵树。
从星球$a$到星球$b$要花费$[dis(a,b)\ Xor\ M]$秒。($dis(a,b)$表示$ab$间的航线长度,$Xor$为位运算中的异或)
为了给仓库选址,小奇想知道,星球$i(1\leqslant i\leqslant n)$到其它所有星球花费的时间之和。
输入格式
第一行包含两个正整数$n$,$M$。
接下来$n-1$行,每行$3$个正整数$a,b,c$,表示$a$,$b$之间的航线长度为$c$。
输出格式
$n$行,每行一个整数,表示星球$i$到其它所有星球花费的时间之和。
样例
样例输入:
4 0
1 2 1
1 3 2
1 4 3
样例输出:
6
8
10
12
数据范围与提示

保证答案不超过$2\times {10}^9$。
题解
$M=0$的时候的树上$DP$谁都会(假设),那么回归这道题,该怎么办呢?
先来观察数据范围,发现$M$很小,所以依然考虑从$M$入手。
那么我们先来考虑$M=1$的情况,我们只需要在$Xor$的时候记录有多少个$0$,多少个$1$,然后每当一条路径到2,那部分就再记录一个值。
现在来考虑满分算法,我们考虑$0\sim 16$,利用$bitset$不就好啦嘛~
时间复杂度:$\Theta(N\times M)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
struct rec
{
int nxt;
int to;
int w;
}e[200000];
int head[100001],cnt;
int n,m;
int ans[100001];
int size[100001];
int bit1[100001][20],bit2[100001][20];
long long dp[100001],g[100001];
bool vis[100001];
void add(int x,int y,int w)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
e[cnt].w=w;
head[x]=cnt;
}
void dfs(int x)
{
vis[x]=1;
bit1[x][0]=size[x]=1;
for(int i=head[x];i;i=e[i].nxt)
if(!vis[e[i].to])
{
dfs(e[i].to);
dp[x]+=size[e[i].to]*e[i].w+dp[e[i].to];
size[x]+=size[e[i].to];
for(int j=0;j<=15;j++)
bit1[x][(j+e[i].w)&15]+=bit1[e[i].to][j];
}
}
void DP(int x,int fa,long long w)
{
dp[x]=dp[fa];
dp[x]+=(size[1]-size[x]*2)*w;
g[x]=dp[x];
for(int i=0;i<=15;i++)
bit2[x][(i+w)&15]=bit2[fa][i]+bit1[fa][i]-bit1[x][(i-w+16)&15];
for(int i=0;i<=15;i++)
g[x]+=(bit2[x][i]+bit1[x][i])*((i^m)-i);
for(int i=head[x];i;i=e[i].nxt)
if(e[i].to!=fa)
DP(e[i].to,x,e[i].w);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
dfs(1);
g[1]=dp[1];
for(int i=0;i<=15;i++)
g[1]+=bit1[1][i]*((i^m)-i);
for(int i=head[1];i;i=e[i].nxt)
DP(e[i].to,1,e[i].w);
for(int i=1;i<=n;i++)
printf("%lld\n",g[i]-m);
return 0;
}
rp++
[CSP-S模拟测试]:小奇的仓库(warehouse)(树形DP)的更多相关文章
- [CSP-S模拟测试]:小奇的矩阵(matrix)(DP+数学)
题目背景 小奇总是在数学课上思考奇怪的问题. 题目描述 给定一个$n\times m$的矩阵,矩阵中的每个元素$a_{i,j}$为正整数.接下来规定: $1.$合法的路径初始从矩阵左上角出发,每 ...
- 小奇的仓库(树形DP)
「题目背景」 小奇采的矿实在太多了,它准备在喵星系建个矿石仓库.令它无语的是,喵星系的货运飞船引擎还停留在上元时代! 「问题描述」 喵星系有n个星球,星球以及星球间的航线形成一棵树. 从星球a到星球b ...
- [CSP-S模拟测试]:小奇挖矿2(DP+赛瓦维斯特定理)
题目背景 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市场,以便为飞船升级无限非概率引擎. 题目描述 现在有$m+1$个星球,从左到右标号为$0$到$n$,小奇最初 ...
- [CSP-S模拟测试]:小L的数(数位DP+模拟)
题目传送门(内部题132) 输入格式 第一行一个整数$t$. 接下来$t$行每行一个整数$n$. 输出格式 $t$行,每行一个整数表示答案. 样例 样例输入: 41818231232691052109 ...
- bzoj 4711 小奇挖矿 ——“承诺”类树形dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4711 对“承诺”有了更深的了解. 向外和向内要区分,所以 f [ i ][ j ] 表示根向 ...
- 【NOI省选模拟】小奇的花园
「题目背景」 小奇在家中的花园漫步时,总是会思考一些奇怪的问题. 「问题描述」 小奇的花园有n个温室,标号为1到n,温室以及以及温室间的双向道路形成一棵树. 每个温室都种植着一种花,随着季节的变换,温 ...
- 【换根DP】小奇的仓库
题目背景 小奇采的矿实在太多了,它准备在喵星系建个矿石仓库.令它无语的是,喵星系的货运飞船引擎还停留在上元时代! 题目内容 喵星系有\(n\)个星球,星球以及星球间的航线形成一棵树. 从星球\(a\) ...
- BZOJ4446 [Scoi2015]小凸玩密室 【树形Dp】
题目 小凸和小方相约玩密室逃脱,这个密室是一棵有n个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯 泡即可逃出密室.每个灯泡有个权值Ai,每条边也有个权值bi.点亮第1个灯泡不需要花费,之后每点亮4 ...
- [10.12模拟赛] 老大 (二分/树的直径/树形dp)
[10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...
随机推荐
- CentOS 7安装图形界面
之前公司的服务器都是用的CentOS 的系统,需要安装图形界面的时候我会执行以下命令 yum -y groupinstall "X Window System" "Fon ...
- MySQL 中的 information_schema 数据库
1. 概述 information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库.其中 performance_schema 用于性能分析,而 ...
- Altium Designer(AD)使用笔记
在PCB中间打洞,螺丝孔等 制作PCB螺丝孔 1 在Keepout层首先绘制一个圆形(矩形): 2 在绘制PCB时,选中该图形,Tool>>Convert>>create bo ...
- mysql的命令入门
mysql入门实践 学习教程 教程链接地址 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 文 ...
- EF - order by specific values
List<string> s = new List<string>() { "A", "家", "帮", " ...
- spring-第十二篇之两种后处理器
1.扩展IoC容器使用后处理器扩展 bean后处理器:对容器中的bean进行后处理,也就是额外的加强. 容器后处理:对IoC容器进行后处理,增强容器功能. 2.bean后处理器 负责处理容器 ...
- from、includes、indexOf
from.includes.indexOf:https://blog.csdn.net/j59580/article/details/53897630?utm_source=blogxgwz1 语法 ...
- Java笔试题-List l = new List()
前言: 最近遇到的一道很基础的题,有时候大家可能离开了编译器就不行了. import java.util.List; /** * * @author catchegg * create date: 2 ...
- 【记录】mysql 查看某数据库各个表容量大小SQL
有时候我们可能需要了解数据库中各个表的容量及大小,好了解数据库情况. 现只需要一条SQL就可以直观的展示出来. SELECT table_schema AS '数据库', table_name AS ...
- 屏蔽命令任何输出的:>/dev/null 2>&1