正解:hash/二进制分解

解题报告:

传送门!

umm首先提取下题意趴QAQ

大概是说给一棵树,每个点有一个权值,要求修改一些点的权值,使得同一个父亲的儿子权值相同,且父亲的权值必须是所有儿子权值之和

首先其实可以想到,只要树上一个点确定了,其实整棵树都确定了,太显然了懒得证QAQ

所以现在其实是只要确定任意一个点就能知道要修改的数量

显然对根进行考虑是最简单的,因为知道根就知道总量,然后就十分显然地出来ans了,甚至答案都能被直接表示出来,设当前节点的权值为a[x],有tot个儿子,那么它的所有儿子节点就是a[x.son]=a[x]/tot

然后考虑,要尽量少的点修改,就是要尽量多的点不被修改,考虑怎么样的时候两个点是都不会被修改的?

不就是从根走到节点的链上的子节点个数乘积再乘以当前节点的权值相等嘛,这儿可以get趴,不能get的自己画个图然后钦定两个点相等从下向上递推过去就能get这个结论了QAQ

所以就考虑直接从根结点一路走下去,每到一个节点就记录一路过来经过的节点的子节点个数的乘积,转移非常好想不说

然后现在就变成了有多少个相等的权值,总量减最多的相等的权值的数量就是ans了

最后一个细节是,直接这么乘下去会爆精度,这里有两个处理方法,分别说下QAQ

第一个是可以想起之前有次考试求乘法最短路,用的就是转化成log,利用指数的美好性质,把乘法变成了加法,这里同样的思考,就把他们都取个log,然后就变成了加法,就欧克了QAQ

第二个是可以用个hash,就一路上取膜,然后判是否相等,然后为了保证正确性,就多取几个数,多膜几次就好

然后感觉hash那个挺麻烦的,,,我我我打到一半打不下去了,,,所以先放个麻油打完但是已经不想打的代码好了QAQ

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define ll long long
#define rg register
#define gc getchar()
#define rp(i,x,y) for(rg ll i=x;i<=y;++i)
#define my(i,x,y) for(rg ll i=x;i>=y;--i)
#define e(i,x) for(rg ll i=head[x];i;i=edge[i].nxt) const ll N=+,mod1=,mod2=,mod3=;//,mod4=19871023,mod5=19970122;
ll n,a[N],head[N],ed_cnt,sz[N],hs1[mod1],hs2[mod2],hs3[mod3];//,hs4[mod4],hs5[mod5];
struct ed{ll to,nxt;}edge[N<<];
struct hsh{ll to,nxt;}hsh1[N],hsh2[N],hsh3[N],hsh4[N],hsh5[N]; il ll read()
{
rg char ch=gc;rg ll x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void ad(ll x,ll y){edge[++ed_cnt]=(ed){x,head[y]};head[y]=ed_cnt;}
il void ad_hs1(ll x,ll y){return;}
il void ad_hs2(ll x,ll y){return;}
il void ad_hs3(ll x,ll y){return;}
void dfs1(ll nw,ll muil,ll fa){ad_hs1(muil,a[nw]);e(i,nw)if(edge[i].to^fa)++sz[nw];e(i,nw)if(edge[i].to^fa)dfs1(edge[i].to,muil*sz[nw]%mod1,nw);}
void dfs2(ll nw,ll muil,ll fa){ad_hs2(muil,a[nw]);e(i,nw)if(edge[i].to^fa)dfs2(edge[i].to,muil*sz[nw]%mod2,nw);}
void dfs3(ll nw,ll muil,ll fa){ad_hs3(muil,a[nw]);e(i,nw)if(edge[i].to^fa)dfs3(edge[i].to,muil*sz[nw]%mod3,nw);}
//void dfs4(ll nw,ll muil,ll fa){ad_hs4(muil,a[nw]);e(i,nw)if(edge[i].to^fa)dfs4(edge[i].to,muil*sz[nw]%mod4,nw);}
//void dfs5(ll nw,ll muil,ll fa){ad_hs5(muil,a[nw]);e(i,nw)if(edge[i].to^fa)dfs5(edge[i].to,muil*sz[nw]%mod2,nw);} int main()
{
freopen("mtys.in","r",stdin);freopen("mtys.out","w",stdout);
n=read();rp(i,,n)a[i]=read();rp(i,,n-){ll x=read(),y=read();ad(x,y);ad(y,x);}dfs1(,,);dfs2(,,);dfs3(,,);
return ;
}

还有check和ad函数麻油写QAQ

但是感觉log的那个还是很可做的所以会放下那个的代码应该QAQ

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define ll long long
#define rg register
#define gc getchar()
#define lf long double
#define rp(i,x,y) for(rg ll i=x;i<=y;++i)
#define my(i,x,y) for(rg ll i=x;i>=y;--i)
#define e(i,x) for(rg ll i=head[x];i;i=edge[i].nxt) const ll N=+;const lf eps=1e-;
ll n,a[N],head[N],ed_cnt,num,tmp=;
lf as[N];
struct ed{ll to,nxt;}edge[N<<]; il ll read()
{
rg char ch=gc;rg ll x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void ad(ll x,ll y){edge[++ed_cnt]=(ed){x,head[y]};head[y]=ed_cnt;}
void dfs(ll nw,lf muil,ll fa)
{
as[nw]=muil+(lf)log(a[nw]);ll tot=;e(i,nw)if(edge[i].to^fa)++tot;
e(i,nw)if(edge[i].to^fa)dfs(edge[i].to,muil+(lf)log(tot),nw);
} int main()
{
// freopen("mtys.in","r",stdin);freopen("mtys.out","w",stdout);
n=read();rp(i,,n)a[i]=read();rp(i,,n-){ll x=read(),y=read();ad(x,y);ad(y,x);}dfs(,log(1.0),);
sort(as+,as++n);rp(i,,n)if(abs(as[i]-as[i-])<=eps)++tmp;else num=max(num,tmp),tmp=;num=max(num,tmp);printf("%lld\n",n-num);
return ;
}

然后那个log的代码是真的简单,,,QAQ

洛谷P3237 米特运输 [HNOI2014] hash/二进制分解的更多相关文章

  1. 洛谷P3237 米特运输

    题目链接 题意: 中文题,挺好理解.就是让节点的权值等于各子节点权值之和,然后每个子节点的权值相等,原本每个点有一个权值,通过最少次的修改(可以修改成小数)使其满足要求. 分析: 题意一旦读明白,题什 ...

  2. 洛谷 P3237 [HNOI2014]米特运输 解题报告

    P3237 [HNOI2014]米特运输 题目描述 米特是\(D\)星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题. \(D\)星上有 ...

  3. 【题解】【洛谷 P1967】 货车运输

    目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...

  4. 【题解】洛谷P1967 [NOIP2013TG] 货车运输(LCA+kruscal重构树)

    洛谷P1967:https://www.luogu.org/problemnew/show/P1967 思路 感觉2013年D1T3并不是非常难 但是蒟蒻还是WA了一次 从题目描述中看出每个点之间有许 ...

  5. 洛谷P3237 [HNOI2014]米特运输(树形dp)

    解题报告 题干 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题. D星上有N个城市,我们将其顺序编号为1到N,1号城市为首都. ...

  6. 洛谷P3237 [HNOI2014]米特运输

    题目描述 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储 存一直是一个大问题.D星上有N个城市,我们将其顺序编号为1到N,1号城市为首都.这N个 ...

  7. 洛谷 P3237 [HNOI2014]米特运输

    题面链接 get到新技能当然要来记录一下辣 题意:给一棵树,每个点有一个权值,要求同一个父亲的儿子的权值全部相同,父亲的取值必须是所有儿子的权值和,求最少的修改数量 sol:自己瞎鸡巴yy一下可以发现 ...

  8. 洛谷P3234 抄卡组 [HNOI2014] 字符串hash

    正解:字符串hash 解题报告: 传送门! 字符串hash是字符串匹配中很常见的一个方法,原理也很好懂,这里就不做太多阐述辣有时间放到hash笔记里面去QAQ 题意不说了挺好理解的,自带一句话概括好评 ...

  9. 洛谷P1117 优秀的拆分【Hash】【字符串】【二分】【好难不会】

    题目描述 如果一个字符串可以被拆分为AABBAABB的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串aabaabaaaabaabaa,如果令 A=aabA ...

随机推荐

  1. Loadrunner C/S关联函数(LSP)AND(LSSS)使用-案例

    LSP就是lrs_save_param()函数 LSSS就是lrs_save_searched_string()函数 一下我们用一个例子去说明他们的使用. C/S机制和B/S不一样,特别是有一个dat ...

  2. 批量 kill mysql 线程

    时常有一些烂sql跑在数据库里,我们要进行kill,避免影响拖垮数据库. mysql> show processlist; +----+------+---------------------+ ...

  3. 【转】详解在visual studio中使用git版本系统(图文)

    http://blog.csdn.net/wojilu/article/details/6976230 很多人已经在使用git(或正在转移到git上),在github.com上,也看到不少国内同学的开 ...

  4. 解决Xcode删除文件后missing file警告

    在用xcode开发的时候,删除不用的文件后, 编译的时候会有missing file的警告,原因是由于SVN或git造成的,有几种方法可以解决. 1.命令行进入missing file目录,然后运行 ...

  5. Python简易web服务

    利用Python自带的包可以建立简单的web服务器.在DOS里cd到准备做服务器根目录的路径下,输入命令: python -m Web服务器模块 [端口号,默认8000] 例如: python -m ...

  6. EF5+MVC4系列(12) 在主视图中直接用RenderAction调用子Action,并返回视图(Return View)或者分部视图(Return PartialView); 从主Action传值到子Action使用TempData传值;TempData高级用法

    结论: ViewData 适用于 在一次请求中 传递数据  . 比如我们从 主Action 到 主视图, 然后在 主视图中  用 RenderAction 请求子Action的时候,就是算作 一次请求 ...

  7. Docker for Windows 代理设置(linux container)

    https://blog.csdn.net/mzhangsf/article/details/79747979

  8. [hive] hiveql 基础操作

    1. 显示当前的数据库信息 直接修改hive.site.xml ,永久显示 2. 建表,模糊显示表信息 drop  table   表名称: --删除表 show tables ;--显示所有表 sh ...

  9. 8 -- 深入使用Spring -- 5...1 启用Spring缓存

    8.5.1 启用Spring缓存 Spring配置文件专门为缓存提供了一个cache:命名空间,为了启用Spring缓存,需要在配置文件中导入cache:命名空间. 导入cache:命名空间之后,启用 ...

  10. BackgroundWorker学习笔记

    1 简介 BackgroundWorker 类允许您在单独的专用线程上运行操作. 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态. 如果您需要能进行响 ...