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

Description

米特是D星球上一种非常神秘的物质,蕴含着巨大的能量。在以米特为主要能源的D星上,这种米特能源的运输和储

存一直是一个大问题。D星上有N个城市,我们将其顺序编号为1到N,1号城市为首都。这N个城市由N-1条单向高速

通道连接起来,构成一棵以1号城市(首部)为根的树,高速通道的方向由树中的儿子指向父亲。树按深度分层:

根结点深度为0,属于第1层;根结点的子节点深度为1,属于第2层;依此类推,深度为i的结点属于第i+l层。建好

高速通道之后,D星人开始考虑如何具体地储存和传输米特资源。由于发展程度不同,每个城市储存米特的能力不

尽相同,其中第i个城市建有一个容量为A[i]的米特储存器。这个米特储存器除了具有储存的功能,还具有自动收

集米特的能力。如果到了晚上六点,有某个储存器处于未满的状态,它就会自动收集大气中蕴含的米特能源,在早

上六点之前就能收集满;但是,只有在储存器完全空的状态下启动自动收集程序才是安全的,未满而又非空时启动

可能有安全隐患。早上六点到七点间,根节点城市(1号城市)会将其储存器里的米特消耗殆尽。根节点不会自动

搜集米特,它只接受子节点传输来的米特。早上七点,城市之间启动米特传输过程,传输过程逐层递进:先是第2

层节点城市向第1层(根节点城市,即1号城市)传输,直到第1层的储存器满或第2层的储存器全为空;然后是第3

层向第2层传输,直到对于第2层的每个节点,其储存器满或其予节点(位于第3层)的储存器全为空;依此类推,

直到最后一层传输完成。传输过程一定会在晚上六点前完成。

由于技术原因,运输方案需要满足以下条件:

(1)不能让某个储存器到了晚上六点传输结束时还处于非空但又未满的状态,这个时候储存器仍然会启动自动收集

米特的程序,而给已经储存有米特的储存器启动收集程序可能导致危险,也就是说要让储存器到了晚上六点时要么

空要么满;

(2)关于首都——即1号城市的特殊情况,  每天早上六点到七点间1号城市中的米特储存器里的米特会自动被消耗

殆尽,即运输方案不需要考虑首都的米特怎么运走;

(3)除了1号城市,每个节点必须在其子节点城市向它运输米特之前将这座城市的米特储存器中原本存有的米特全部

运出去给父节点,不允许储存器中残存的米特与外来的米特发生混合;

(4)运向某一个城市的若干个来源的米特数量必须完全相同,不然,这些来源不同的米特按不同比例混合之后可能

发生危险。

现在D星人已经建立好高速通道,每个城市也有了一定储存容量的米特储存器。为了满足上面的限制条件,可能需

要重建一些城市中的米特储存器。你可以,也只能,将某一座城市(包括首都)中原来存在的米特储存器摧毁,再

新建一座任意容量的新的米特储存器,其容量可以是小数(在输入数据中,储存器原始容量是正整数,但重建后可

以是小数),不能是负数或零,使得需要被重建的米特储存器的数目尽量少。

Solution

这个题的确很难…读懂

语文水平越来越差了

看了样例应该有点提示,其实就是要每个父节点u容量为子节点容量的d[u](子节点个数)倍

也就是说,确定了任一点的容量,整棵树的容量都是确定的

我们要做的是看确定哪一点需要的改动最少,就是看最多有多少个点确定的是相同的树(可以通过“只要节点1的容量是相同的树就是相同的”判断)

t[i]:确定点i后节点1的容量

因为数据很大,所以用到log(a*b)=log(a)+log(b)转换成log加法计算

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define eps 1e-9
#define MAXN 500005
#define INF 0x3f3f3f3f
#define Max(a,b) (a>b?a:b)
using namespace std;
int n,a[MAXN],d[MAXN],head[MAXN],cnt=0;
double s[MAXN],t[MAXN];
struct Node{
    int next,to;
}Edges[MAXN*2];
int dcmp(double x)
{
    if(fabs(x)<eps)return 0;
    return x>0?1:-1;
}
void addedge(int u,int v)
{
    Edges[++cnt].next=head[u];
    head[u]=cnt;
    Edges[cnt].to=v;
}
int read()
{
    int x=0,f=1;char c=getchar();
    while(c<‘0‘||c>‘9‘){
        if(f==‘-‘)f=-1;c=getchar();
    }
    while(c>=‘0‘&&c<=‘9‘){
        x=x*10+c-‘0‘;c=getchar();
    }
    return x*f;
}
void get_s(int u,int f)
{
    for(int i=head[u];~i;i=Edges[i].next)
    {
        int v=Edges[i].to;
        if(v==f)continue;
        s[v]=s[u]+log(d[u]);
        get_s(v,u);
    }
}
int main()
{
    n=read();
    for(int i=1;i<=n;i++)
    a[i]=read();
    memset(head,-1,sizeof(head));
    memset(d,-1,sizeof(d));
    d[1]=0;
    for(int i=1;i<n;i++)
    {
        int a=read(),b=read();
        addedge(a,b);
        addedge(b,a);
        d[a]++;d[b]++;
    }
    s[1]=log(1);get_s(1,0);
    for(int i=1;i<=n;i++)
    t[i]=log(a[i])+s[i];
    sort(t+1,t+1+n);
    int ans=0,cnt=1;
    for(int i=2;i<=n;i++)
    {
        if(!dcmp(t[i]-t[i-1]))
        cnt++;
        else ans=Max(ans,cnt),cnt=1;
    }
    ans=Max(ans,cnt);
    printf("%d\n",n-ans);
    return 0;
} 
时间: 2024-08-05 11:16:16

[BZOJ 3573][Hnoi2014]米特运输(乱搞)的相关文章

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

【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星人开始考虑如何具体地储存和传输米特资源.由于发展程

bzoj3573[Hnoi2014]米特运输

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

洛谷 P3237 [HNOI2014]米特运输

这其实是超级大水题,难度不及一道提高组的dp,如果读懂了题面... 好吧我读懂了题面,然而并不知道1号节点是否一定要装满... (根据做题的情况来看1号也是要装满的,尽管不进行能量收集) 然而为什么我还是不会做呢.... 稍微观察一下就可以发现: 根节点容量确定后,整棵树容量都可以确定. 因此如果要保证树上某一节点的容量不进行修改,那么根节点必须为某一确定容量 记ncn[i]为i节点的子节点个数,那么对于原来容量为a[i]的节点i,如果不能修改,则要求根节点容量为 a[i]*(i到根节点的路径上

BZOJ3573 [Hnoi2014]米特运输 【贪心】

题目链接 BZOJ3573 题解 题目又臭又长系列 题意:修改尽量少的点权,使得: ①同个节点的所有儿子点权相同 ②任意非叶节点权值等于其儿子权值之和 容易发现一旦任意一个点权值确定,整棵树权值就确定 一个比较简单的想法是枚举根节点权值 但我们可以通过计算出每个节点如若保留原值,根节点会是什么值 如果两个节点能同时不变,当且仅当它们对应根节点权值相等 我们算出来排序选择权值最多的那一个就好了 直接乘会爆\(long long\),可使用\(log\)转化为加法 #include<algorith

【BZOJ-3573】米特运输 树形DP

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

【BZOJ 4148】 4148: [AMPPZ2014]Pillars (乱搞)

4148: [AMPPZ2014]Pillars Time Limit: 5 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 100  Solved: 49 Description 给定一个n*m的矩形,其中有f个2*2的障碍物,其中任意两个障碍物中心之间的欧几里得距离至少为6, 且每个障碍物的中心到边缘的距离至少为3.请找到一条从左下角(1,1)出发经过所有没有障碍物的点各 一次的且最后回到左下角的回路. Input 第一行包含三个整数n,