洛谷 P3237 [HNOI2014]米特运输

这其实是超级大水题,难度不及一道提高组的dp,如果读懂了题面...

好吧我读懂了题面,然而并不知道1号节点是否一定要装满...

(根据做题的情况来看1号也是要装满的,尽管不进行能量收集)

然而为什么我还是不会做呢。。。。

稍微观察一下就可以发现:

根节点容量确定后,整棵树容量都可以确定。

因此如果要保证树上某一节点的容量不进行修改,那么根节点必须为某一确定容量

记ncn[i]为i节点的子节点个数,那么对于原来容量为a[i]的节点i,如果不能修改,则要求根节点容量为

a[i]*(i到根节点的路径上所有点的ncn值的乘积(不含i,含根节点))。

那么求出所有节点保证它们不修改要求的根节点容量,找出出现次数最多的那个,其出现次数为ans,则答案为n-ans.

稍微看一下就可以发现这样子肯定是爆longlong了,都不知道爆到哪里去了。。。。然后我就不会了。。

有一些很好的方法:

1.可以发现最终只会计算出n个答案(尽管很大),并不怎么会冲突,因此乘法可以取模(不放心可以多算几份取不同模的)

2.同上,可以用log(n)代替n,而计算乘法时,log(ab)=log(a)+log(b),使要记录的数据值大大缩小

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<map>
 5 #define eps 1e-7
 6 using namespace std;
 7 struct E
 8 {
 9     int to,nxt;
10 }e[1000010];
11 int f1[500100],ne,n,a[500100],ncn[500100],ans;
12 double dis[500100];
13 void dfs(int u,int fa)
14 {
15     for(int k=f1[u];k;k=e[k].nxt)
16         if(e[k].to!=fa)
17         {
18             dis[e[k].to]=dis[u]+log(ncn[u]);
19             dfs(e[k].to,u);
20         }
21 }
22 struct Cmp
23 {
24     bool operator()(double a,double b)
25     {
26         if(fabs(a-b)<eps)    return 0;
27         else    return a<b;
28     }
29 };
30 map<double,int,Cmp> ma;
31 int main()
32 {
33     int i,x,y;
34     scanf("%d",&n);
35     for(i=1;i<=n;i++)    scanf("%d",&a[i]);
36     for(i=1;i<n;i++)
37     {
38         scanf("%d%d",&x,&y);
39         e[++ne].to=y;e[ne].nxt=f1[x];f1[x]=ne;
40         e[++ne].to=x;e[ne].nxt=f1[y];f1[y]=ne;
41         ncn[x]++;ncn[y]++;
42     }
43     for(i=2;i<=n;i++)    ncn[i]--;
44     dfs(1,0);
45     for(i=1;i<=n;i++)    dis[i]+=log(a[i]),ma[dis[i]]++;
46     //for(i=1;i<=n;i++)  printf("%lf\n",dis[i]);
47     for(map<double,int,Cmp>::iterator it=ma.begin();it!=ma.end();++it)    ans=max(ans,it->second);
48     printf("%d",n-ans);
49     return 0;
50 }

原文地址:https://www.cnblogs.com/hehe54321/p/8629738.html

时间: 2024-10-10 16:15:24

洛谷 P3237 [HNOI2014]米特运输的相关文章

【BZOJ 3573】 [Hnoi2014]米特运输

3573: [Hnoi2014]米特运输 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 618 Solved: 359 [Submit][Status][Discuss] Description 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题. D星上有N个城市,我们将其顺序编号为1到N,1号城市为首都.这N个城市由N-1条单向高速通道连接起来,构成一棵以1号城市(首部)为

[HNOI2014]米特运输

题目描述 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题. D星上有N个城市,我们将其顺序编号为1到N,1号城市为首都.这N个城市由N-1条单向高速通道连接起来,构成一棵以1号城市(首部)为根的树,高速通道的方向由树中的儿子指向父亲.树按深度分层:根结点深度为0,属于第1层:根结点的子节点深度为1,属于第2层:依此类推,深度为i的结点属于第i+l层. 建好高速通道之后,D星人开始考虑如何具体地储存和传输米特资源.由于发展程

[BZOJ 3573][Hnoi2014]米特运输(乱搞)

Description 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储 存一直是一个大问题.D星上有N个城市,我们将其顺序编号为1到N,1号城市为首都.这N个城市由N-1条单向高速 通道连接起来,构成一棵以1号城市(首部)为根的树,高速通道的方向由树中的儿子指向父亲.树按深度分层: 根结点深度为0,属于第1层:根结点的子节点深度为1,属于第2层:依此类推,深度为i的结点属于第i+l层.建好 高速通道之后,D星人开始考虑如何具体地储存和传输米

洛谷 P1282 多米诺骨牌

题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中,S1=6+1+1+1=9,S2=1+5+3+2=11,|S1-S2|=2.每个多米诺骨牌可以旋转180°,使得上下两个方块互换位置. 编程用最少的旋转次数使多米诺骨牌上下2行点数之差达到最小. 对于图中的例子,只要将最后一个多米诺骨牌旋转180°,可使上下2行点数之差为0. 输入输出格式 输入格式: 输入文件的第一行是一个正

poj 1717==洛谷P1282 多米诺骨牌

Dominoes Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6571   Accepted: 2178 Description A domino is a flat, thumbsized tile, the face of which is divided into two squares, each left blank or bearing from one to six dots. There is a ro

洛谷P1282 多米诺骨牌

动态规划 题意: 对多米诺骨牌进行翻转,使其上下值最接近,求最小的翻转次数 1.状态 dp[ i ][ j ] 表示上面那排前i个数 和为 j 所需要的最小的翻转次数 2.状态转移方程 dp[ i ][ j ] = min(dp[ i ][ j ],dp[ i-1 ][ j-a[ i ] ] ) ; dp[ i ][ j ] = min(dp[ i ][ j ],dp[ i-1 ][ j-b[ i ] ]+1 ) ; 3.初始值 dp[ i ][ j ] = inf dp[ 0 ][ 0 ] =

bzoj3573[Hnoi2014]米特运输

http://www.lydsy.com/JudgeOnline/problem.php?id=3573 好吧,虽然这是day1最后一题,但却是最水的一题....(前提:看懂题目) 仔细看题! 仔细看题! 仔细看题! 看懂题后就知道设第$i$个点的儿子节点的个数为$degree[i]$,容量为$A[i]$,我们要修改最少的点的容量,使得每个点$i$的儿子的容量均为$\frac{A[i]}{degree[i]}$ 我们发现如果一个点的容量是确定的,那么整个树的容量都是确定的 我们记第$i$个点的所

bzoj 3573: [Hnoi2014]米特运输

一个根节点的权值会决定一棵树全部的权值是显然的(一开始也想,枚举一下??呵呵,这么sb的做法怎么可能对,然后就想各种各样的乱搞) 在扒到题解之后,发现还还有取log这个奇巧淫技,, 那么这样对每个点算一下,这个点的权值不变的话,根节点的权值会是多少,那么找一下相同权值最多的就好 (这种乘法会炸的可以尝试去log,,,) 1 #include <bits/stdc++.h> 2 #define LL long long 3 #define lowbit(x) x&(-x) 4 #defi

【BZOJ】3573: [Hnoi2014]米特运输

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3573 屁话一堆,就是说: 1.一棵树中的每个点的每个儿子的权值之和要等于这个点的权值 2.一棵树中的每个点的每个儿子的权值相等. 所以,考虑确定一个点即确定的整个树的每个点的权值,但是我们受限于数据范围又不能枚举每一个点,所以枚举每一个点,考虑这个点的权值不变的话根节点的权值会是多少,这个是可以DP的,然后取个众数即可. 当然,权值过大所以需要一发HASH. 1 #include<ios