首页 > TAG信息列表 > HAOI2015
NC19996 [HAOI2015]树上染色
题目链接 题目 题目描述 有一棵点数为N的树,树边有边权。给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色。 将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间距离的和的收益。问收益最大值是多少。 输入描述 第一行两个整数N,[HAOI2015]按位或
[HAOI2015]按位或 min-max 容斥 记 \(\max\{S\}\) 表示 \(S\) 中每一数都被选到过的期望时间,\(\min\{S\}\) 表示 \(S\) 中出现至少一个数被选到的期望时间 答案显然为 \(\max\{U\}\) ,\(U= \{n \cdot 1\}\) 直接求 \(\max\{U\}\) 不好求,利用 min-max 容斥转化为求 \(\min\{S\}\) \([HAOI2015] 按位或 题解
min_max 容斥 Statement 一个数字,从 \(0\) 开始,每次按位或上一个数 \(P3178 [HAOI2015]树上操作
操作 1 :把某个节点 x 的点权增加 a 。 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。 操作 3 :询问某个节点 x 到根的路径中所有点的点权和。 树剖板子 const int N=1e5+79; int a[N],b[N]; int n,m; struct graph{ int head[N],tot,next[N<<1],ver[N<<1]; inline v[HAOI2015]树上操作 T19 D71
[HAOI2015]树上操作 T19 D71 [HAOI2015]树上操作 树剖模板题 #include<bits/stdc++.h> #define ll long long #define pii pair<int,int> #define fi first #define se second #define pb push_back #define si size() #define ls (p<<1) #define rs ((p<<1)|1) #[HAOI2015] 树上染色
[HAOI2015] 树上染色 树形 \(DP\) , 一道有点恶心的树上背包. 设状态 \(f[x][i]\) 表示以 \(x\) 为根节点的子树中选 \(i\) 个节点染黑的最大价值. 考虑转移, 枚举以 \(x\) 为根节点的子树中选 \(j\) 个黑点, \(x\) 的子节点 \(y\) 选 \(k\) 个黑点, 那么 \(dis(i, j)\) 就被计算洛谷 P3178 [HAOI2015]树上操作
P3178 [HAOI2015]树上操作 原题链接 Solution 树链剖分 树链剖分板子题,比板子还板子 关于树链剖分我就不多说了,如果又不会的话可以看我的博客 浅谈树链剖分 回归正题,我们发现题目只要求单点加,子树加,以及查询一点到根节点路径和。 单点加不就是区间加把左右端点改成那个点吗? 子树加【题解】[HAOI2015]树上染色
[HAOI2015]树上染色 \(\text{Solution:}\) 考虑对于一个点,从它子树再中选择 \(k\) 个黑点的代价:\(e[i].dis \cdot (p-k)*k+(siz[j]-k)*(n-p-siz[j]+k).\) 于是状态转移方程就写好了: \(dp[x][T]=dp[x][T]=Max(dp[x][T],dp[x][T-k]+dp[j][k]+v*(k*(p-k)+(siz[j]-k)*(n-p-siz[j]+k)))[HAOI2015]树上染色
题面 一个树形dp, 我们根据题意去想如何得到两两距离,发现一条边的两侧每有一对同色点,这条边就要被经过一次 在当前的子节点的子树中,枚举有k个黑点,需要一个在其他子树中选了共 j - k 个黑点的状态 code #include<bits/stdc++.h> #define int long long usingLuogu3178 [HAOI2015]树上操作
原题链接:https://www.luogu.com.cn/problem/P3178 树上操作 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a 。 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。 操作 3 :询问某个节点 x 到根的LG P3175 [HAOI2015]按位或
Description 刚开始你有一个数字 $0$,每一秒钟你会随机选择一个 $[0,2^n-1]$ 的数字,与你手上的数字进行或(C++,C 的 `|`,pascal 的 `or`)操作。选择数字 $i$ 的概率是 $p_i$。保证 $0\leq p_i \leq 1$,$\sum p_i=1$ 。问期望多少秒后,你手上的数字变成 $2^n-1$。 Solution Min-Max容斥转[HAOI2015]树上染色
Link 按点来算贡献的话并不好算。考虑到路径长度和可以拆分成每条边的长度乘上其被经过的次数,所以统计边的贡献就可以了。树上一条边会将树分成两边,而该边被经过的次数实质上就是两边的白点个数之积加上黑点个数积。因为定了根,所以其中一边可以按子树考虑,于是就转换成了树形dp。 #洛谷P3178 [HAOI2015]树上操作
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a 。 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。 操作 3 :询问某个节点 x 到根的路径中所有点的点权和。 输入格式 第一行包含两个整数 N, M 。表示树形背包复杂度+P3177 [HAOI2015]树上染色
惊奇的发现躺在任务计划里几个月的“\(P3177\)树上染色”变成蓝题了,既然前几天清北学堂提到这题了,那就看一眼。(众所周知,洛谷任务计划是个栈) 本人十分不擅长\(DP\),尤其像什么树形背包题,尤其是为啥看上去 \(n^3\) 的复杂度都说是 \(n^2\) 的,让我十分害怕,因为别人说的经典句子什么"两[HAOI2015] 数组游戏 - 博弈论,SG函数
有一个长度为N的数组,甲乙两人在上面进行这样一个游戏:首先,数组上有一些格子是白的,有一些是黑的。然后两人轮流进行操作。每次操作选择一个白色的格子,假设它的下标为x。接着,选择一个大小在1~n/x之间的整数k,然后将下标为x、2x、...、kx的格子都进行颜色翻转。不能操作的人输。现在甲(bzoj4036 [HAOI2015]按位或
题目描述 题解 考虑 min−maxmin-maxmin−max 容斥 设 E(max/min{s})E(max/min\{s\})E(max/min{s}) 表示 sss 集合中最晚/最早出现的元素的时间的期望 则 E(max{s})=∑t⊆s(−1)∣T∣−1E(min{t})E(max\{s\})=\sum_{t⊆s}(-1)^{|T|-1}E(min\{t\})E(max{s})=∑t⊆s(−1)∣Tbzoj4036 [HAOI2015]按位或 状压DP + MinMax 容斥
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4036 题解 变成 \(2^n-1\) 的意思显然就是每一个数位都出现了。 那么通过 MinMax 容斥,可以把问题转化为对于一个集合 \(S\),求 \(S\) 中至少有一个元素出现的概率。 这个问题等价于求 \(S\) 中没有任何一个元素出现的概率p3177 [HAOI2015]树上染色
分析 dp[x][i]表示以x为根的子树有i个黑点的方案数 我们发现每次转移要枚举这个点的子树大小和儿子的子树大小 看似复杂度O(n^3) 但是我们可以把循环转化为枚举x子树内的点再枚举它儿子的子树内的点 发现对于一个点它作为儿子子树的点枚举时最多只会和一个点同时枚举到一次 所以总LuoGuP3177:[HAOI2015]树上染色
Pre 想不出来,不得不说这套路还不错。 调试代码到了最后发现有一个地方 \(u\) 写成了 \(to[i]\) Solution 考虑每一条边的贡献。 \(w=w_i*cntblack_{left}*cntblack_{right}+w_i*cntwhite_{left}*cntwhite_{right}\) 以这个等式进行 \(DP\) 最终计算答案。 Code #include <cstdio>[BZOJ4033][树形DP]HAOI2015:树上染色
BZOJ4033 这道题最关键的思想在于,我们以往树形DP的时候,常常设f[i][j]f[i][j]f[i][j]表示点iii的子树的dpdpdp值,而这道题对于一个点的子树,它的贡献是子树内所有黑点到子树的根节点的距离之和乘上其兄弟的子树的黑点个数,白点同理,因为只能染k个,所以必须记录染了几个黑点,这样的状