BZOJ3573: [Hnoi2014]米特运输(树上乱搞)
Submit: 1669 Solved: 1031
[Submit][Status][Discuss]
Description
Input
Output
输出文件仅包含一行,一个整数,表示最少的被重建(即修改储存器容量)的米特储存器的数目。
Sample Input
5
4
3
2
1
1 2
1 3
2 4
2 5
Sample Output
HINT
【样例解释】
一个最优解是将A[1]改成8,A[3]改成4,A[5]改成2。这样,2和3运给1的量相等,4和5运给2的量相等,且每天晚上六点的时候,1,2满,3,4,5空,满足所有限制条件。
Source
神题!!
此题有一个非常重要的性质:当一个点的权值确定之后,整棵树的权值就都确定了
盗用一下矩形方块大佬的图
那么我们可以固定一个数不变,观察此时根节点的值是多少
设$f[i]$表示当$i$号节点的权值不变时,根节点的值是多少
那么我们可以枚举每一个点,计算完成后对$f$数组排序,找出最长的权值相同的序列,然后再用总结点的数量减去它的长度,就是最终答案
但是根据数据范围不难看出,根节点的值会爆long long,
有两种解决方法:
1.考虑到所有的计算都是乘法,取log变为加法$log_x{ab}=log_x{a}+log_x{b}$
2.hash
速度差不多
反思:
刚开始的时候一直在考虑如何计算一个节点改变后整棵树的形态,但是这样的话问题就太复杂了,因此再遇到此类问题的时候一定要从宏观上去考虑,看看有没有更妙的方法
// luogu-judger-enable-o2 #include<cstdio> #include<vector> #include<cstring> #include<cmath> #include<algorithm> #define LL long long using namespace std; const int MAXN=1e6+10; #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<22,stdin),p1==p2)?EOF:*p1++) char buf[1<<22],*p1=buf,*p2=buf; inline int read() {char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f; } vector<int>v[MAXN]; int N; int val[MAXN],outder[MAXN]; double f[MAXN]; void dfs(int now, double times) {f[now] = times + log((double)val[now]);for(int i = 0;i < v[now].size();i++)dfs(v[now][i], times + log((double)outder[now])); } int main() {#ifdef WIN32freopen("a.in","r",stdin);#endifN = read();for(int i = 1;i <= N;i++) val[i] = read();for(int i = 1;i <= N-1;i++) {int x = read(), y = read();outder[x]++;v[x].push_back(y);}dfs(1,log((double)1));sort(f+1,f+N+1);int now=0,ans=0;for(int i = 1;i <= N;i++)(f[i] - f[i-1] < 1e-8) ? ans = max(ans, ++now) : now = 1;printf("%d",N - ans); return 0; }
取log
// luogu-judger-enable-o2 // luogu-judger-enable-o2 #include<cstdio> #include<vector> #include<cstring> #include<cmath> #include<algorithm> #define LL long long using namespace std; const int MAXN = 1e6+10, mod = 19260817; #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<22,stdin),p1==p2)?EOF:*p1++) char buf[1<<22],*p1=buf,*p2=buf; inline int read() {char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f; } vector<int>v[MAXN]; int N; int val[MAXN],outder[MAXN]; double f[MAXN]; void dfs(int now, double times) {f[now] = (LL)times * val[now] %mod ;for(int i = 0;i < v[now].size();i++)dfs(v[now][i], (LL)times * outder[now] % mod); } int main() {#ifdef WIN32freopen("a.in","r",stdin);#endifN = read();for(int i = 1;i <= N;i++) val[i] = read();for(int i = 1;i <= N-1;i++) {int x = read(), y = read();outder[x]++;v[x].push_back(y);}dfs(1,1);sort(f+1,f+N+1);int now=0,ans=0;for(int i = 1;i <= N;i++)(f[i] == f[i-1]) ? ans = max(ans, ++now) : now = 1;printf("%d",N - ans); return 0; }
hash
转载于:https://www.cnblogs.com/zwfymqz/p/8846080.html
BZOJ3573: [Hnoi2014]米特运输(树上乱搞)相关推荐
- BZOJ3573:[HNOI2014]米特运输(树形DP)
Description 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储 存一直是一个大问题.D星上有N个城市,我们将其顺序编号为1到N,1号城市 ...
- 洛谷P3237 [HNOI2014]米特运输 题解
洛谷P3237 [HNOI2014]米特运输 题解 题目链接:P3237 [HNOI2014]米特运输 题意: 这题面是真的长啊 qwq 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为 ...
- BZOJ 3573 [HNOI2014]米特运输
题目链接:传送门 冗长冗长的题面: 3573:[HNOI2014]米特运输3573: [HNOI2014]米特运输3573:[HNOI2014]米特运输 Description 米特是D星球上一种非常 ...
- P3237 [HNOI2014]米特运输
P3237 [HNOI2014]米特运输 第104道题让我洛谷红名. (^ w ^) 题目描述 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存 ...
- 【bzoj3573】[Hnoi2014]米特运输
题目链接 Description 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题. D星上有N个城市,我们将其顺序编号为1到N ...
- [HNOI2014]米特运输
Description 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题.D星上有N个城市,我们将其顺序编号为1到N,1号城市为 ...
- 洛谷P3237 [HNOI2014]米特运输
题目描述 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题. D星上有N个城市,我们将其顺序编号为1到N,1号城市为首都.这N个 ...
- hnoi2014米特运输
思维题 略水 我们一定要用以偏概全的眼光做这道题... 一根节点说明一切 #include <cstdio> #include <cstring> #include < ...
- AcWing 397. 逃不掉的路(边双连通分量缩点成树 + 树链剖分乱搞)
整理的算法模板合集: ACM模板 我们知道在同一个边双连通分量中的点没有必经边(因为至少有两条分离的路径). 所以我们直接tarjan求出桥后缩点,然后求一下树上两点间的距离即可. 那么如何求树上两点 ...
最新文章
- href 一个正则表达式的解析 ? 号解析
- Cpp 对象模型探索 / 虚函数表和虚函数表指针的创建时机
- Map的并发处理(ConcurrentHashMap)
- css中的em 简单教程 -- 转
- mysql 最值复杂查询_MySQL高级查询
- python web开发,organization的model设计
- php 获取路由器mac地址,php如何获取网卡MAC地址(支持WIN与LINUX系统)
- 试试Write Live Writer在博客园的使用
- 【转】Dalvik虚拟机的启动过程分析
- 9.6-9.7 awk
- [渝粤教育] 西南科技大学 市场经济法律专题 在线考试复习资料
- 《构建之法》阅读笔记二
- 003.ASP.NET MVC集中管理Session
- Spring Cloud Ribbon 的请求分发与原理
- Android 自动接听 adb,GitHub - AndroidMsky/RootPlay: 安卓手机秒变网络摄像头,自动接起QQ视频。欢迎star,fork,Issues。...
- 大话卫星导航中的信号处理系列文章——目录
- VmWare16 安装图解
- SQL Server数据库插入数据中文显示乱码问题
- Splashtop 教育行业用户增加700%
- dll病毒文件删不了怎么办