小奇的仓库

题目来源:hzwer

【题目背景】

小奇采的矿实在太多了,它准备在喵星系建个矿石仓库。令它无语的是,喵星系的货运飞船引擎还停留在上元时代!

【问题描述】

喵星系有n个星球,星球以及星球间的航线形成一棵树。

从星球a到星球b要花费[dis(a,b) Xor M]秒。(dis(a,b)表示ab间的航线长度,Xor为位运算中的异或)

为了给仓库选址,小奇想知道,星球i(1<=i<=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

【数据范围】

序号 N M

1 6 0

2 100 5

3 2000 9

4 50000 0

5 50000 0

6 50000 1

7 50000 6

8 100000 10

9 100000 13

10 100000 15

保证答案不超过2*10^9

我们先回忆一下,如果异或值为0(就是没有异或)的情况应该怎么dp:

假如v是u的儿子,他们之间边长为w,tot1[i]表示i子树内所有节点到i的距离和,tot2[i]表示所有非i子树内的节点到i的距离和。那么有:

tot1[u] = sigma{ tot1[v] } + ( size[u] - 1 ) * w ( = sigma{ tot1[v] + size[v] * w } )

tot2[v] = tot2[u] + ( n - size[v] ) * w ( = tot2[u] + ( n - size[u] + size[u] - size[v] ) * w )

直接dfs计算。

那么如果有异或的话,应该怎么搞呢?

我们发现虽然n挺大、c挺大,但是异或的值M很小,最大只有15。所以这么小的异或值可以来搞些什么呢?

我们知道对每两点间的dis,只有mod16的部分会被异或影响,那么我们用树dp求每个点到其他所有点的dis值的mod 16后1~16的各有多少个 和 >16部分(/ 16)的值.

看下黄学长的这两段代码:

第一段很容易懂:

void dfs1(int x,int fa)
{
	for(int i=last[x];i;i=e[i].next)
		if(e[i].to!=fa)
		{
			dfs1(e[i].to,x);
			g[x]+=g[e[i].to]+e[i].v/16;
			f[x][e[i].v%16]++;
			for(int j=0;j<16;j++)
			{
				int k=j+e[i].v;
				g[x]+=k/16*f[e[i].to][j];
				f[x][k%16]+=f[e[i].to][j];
			}
		}
}

第二段需结合第一段来看:

void dfs2(int x,int fa)
{
	for(int i=last[x];i;i=e[i].next)
		if(e[i].to!=fa)
		{
			int tmp=g[x]-g[e[i].to];
			for(int j=0;j<16;j++)
			{
				int k=j+e[i].v;
				tmp-=k/16*f[e[i].to][j];
				t[k%16]=f[x][k%16]-f[e[i].to][j];
			}
			t[e[i].v%16]--;
			g[e[i].to]+=tmp;
			f[e[i].to][e[i].v%16]++;
			for(int j=0;j<16;j++)
			{
				int k=j+e[i].v;
				g[e[i].to]+=k/16*t[j];
				f[e[i].to][k%16]+=t[j];
			}
			dfs2(e[i].to,x);
		}
}
时间: 2024-11-06 07:32:06

小奇的仓库的相关文章

换根dp「小奇的仓库&#183;randomwalking&#183;」

把以前考试换根题集中写一下 随便选一个点做根一遍$dfs$求子树内贡献,再通过特殊手段算$ans[1]$,最后$dfs$求其他$ans$ 拆成子树内,子树外分别算贡献差,得儿子是很常见套路了 小奇的仓库 $M<=15$ 题解 很久之前做的换根dp,当时觉得真是神仙,现在看还是觉得很神仙 不同于一般换根dp,这个题$n^2$并不好写 所以$n^2$算法就省略了 考虑$M$非常小,可以计算$M$对答案影响 一个直接的想法是先算出来原答案,再减去现在答案 //本来为j现在异或M,变化了j-delta

4711: 小奇挖矿

4711: 小奇挖矿 Description [题目背景] 小奇在喵星系使用了无限非概率驱动的采矿机,以至于在所有星球上都采出了一些矿石,现在它准备建一些矿石仓 库并把矿石运到各个仓库里. [问题描述] 喵星系有n个星球,标号为1到n,星球以及星球间的航线形成一棵树.所有星球间的双向航线的长度都为1.小奇要 在若干个星球建矿石仓库,设立每个仓库的费用为K.对于未设立矿石仓库的星球,设其到一个仓库的距离为i,则 将矿石运回的费用为Di.请你帮它决策最小化费用. Input 第一行2个整数n,K.

【BZOJ-4548&amp;3658】小奇的糖果&amp;Jabberwocky 双向链表 + 树状数组

4548: 小奇的糖果 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 103  Solved: 47[Submit][Status][Discuss] Description 有 N 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能够拾 起多少糖果,使得获得的糖果并不包含所有的颜色. Input 包含多组测试数据,第一行输入一个正整数 T 表示测试数据组数. 接下来 T 组测试数据,对于每组测试数据,第

【NOIP模拟赛】小奇挖矿 2

[题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市场,以便为飞船升级无限非概率引擎. [问题描述] 现在有m+1个星球,从左到右标号为0到m,小奇最初在0号星球. 有n处矿体,第i处矿体有ai单位原矿,在第bi个星球上. 由于飞船使用的是老式的跳跃引擎,每次它只能从第x号星球移动到第x+4号星球或x+7号星球.每到一个星球,小奇会采走该星球上所有的原矿,求小奇能采到的最大原矿数量. 注意,小奇不必最终到达m号星球. [输入格式] 第一行2个整数n,m

【BZOJ4548】小奇的糖果 set(链表)+树状数组

[BZOJ4548]小奇的糖果 Description 有 N 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能够拾起多少糖果,使得获得的糖果并不包含所有的颜色. Input 包含多组测试数据,第一行输入一个正整数 T 表示测试数据组数. 接下来 T 组测试数据,对于每组测试数据,第一行输入两个正整数 N.K,分别表示点数和颜色数. 接下来 N 行,每行描述一个点,前两个数 x, y (|x|, |y| ≤ 2^30 - 1) 描述点的位置,最后一个数

[BZOJ4548]小奇的糖果

[BZOJ4548]小奇的糖果 试题描述 有 \(N\) 个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能够拾起多少糖果,使得获得的糖果并不包含所有的颜色. 输入 包含多组测试数据,第一行输入一个正整数 \(T\) 表示测试数据组数. 接下来 \(T\) 组测试数据,对于每组测试数据,第一行输入两个正整数 \(N\).\(K\),分别表示点数和颜色数. 接下来 \(N\) 行,每行描述一个点,前两个数 \(x, y (|x|, |y| \le 2^{3

小奇的花园

[问题描述]小奇的花园有 n 个温室,标号为 1 到 n,温室以及以及温室间的双向道路形成一棵树.每个温室都种植着一种花,随着季节的变换,温室里的花的种类也在不断发生着变化.小奇想知道从温室 x 走到温室 y 的路径中(包括两个端点),第 t 种花出现的次数.[输入格式]第一行为两个整数 n,q,表示温室的数目和操作的数目.第二行有 n 个整数 T 1 ,T 2 ...T n 其中 T i 表示温室 i 中的花的种类.接下来 n-1 行,每个两个整数 x, y,表示温室 x 和 y 之间有一条双

【OJ2216】小奇的数列

2216 -- 小奇的数列(Solution) 题目大意 : 给定一个长度为?\(n\)?的数列,以及?\(m\)?次询问,每次给出三个数?\(l\),\(r\)?和?\(P\),询问 \((\sum_{i=l_1}^{r_1}a_i)\;mod\;P\)?的最小值. 其中 \(l \le l_1 \le r_1 \le r\) . \((n\le 5\times 10^5, m\le 10^4,P\le 500)\) Tag: 抽屉原理.STL Analysis By LC: 最朴素的做法当然

小奇的矩阵(动态规划

[题目 背景] 小奇总是在数学课上思考奇怪的问题. [问题描述] 给定一个 n*m 的矩阵, 矩阵中的每个元素 aij 为正整数. 接下来规定 1. 合法的路径初始从矩阵左上角出发, 每次只能向右或向下走, 终点为右下 角. 2. 路径经过的 n+m-1 个格子中的元素为 A1, A2…A(n+m-1) , Aavg 为 Ai 的平 均数, 路径的 V 值为(n+m-1) *∑ (Ai-Aavg) ^2 (1<=i<=n+m-1) 求 V 值最小的合法路径, 输出 V 值即可, 有多组测试数据