正解: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. mysql中update+select

    mysql中不支持嵌套查询后更新操作. 但是可以使用inner join来解决自身的更新问题,参考如下例子: update hera_job a inner join( ),'"') as ...

  2. 深夜一次数据库执行SQL思考(怎么看执行报错信息)

    如下sql在执行时 DROP TABLE IF EXISTS `book`; CREATE TABLE `book` ( `id` int(11) NOT NULL AUTO_INCREMENT, ` ...

  3. c++类成员函数后边加const是为什么?

    时间是让人猝不及防的东西,晴是有风阴时有雨,争不过朝夕,又念着往昔,偷走了青丝却留住一个你 #include <iostream> #include <string> usin ...

  4. Linux部署Web应用程序超链接下载中文名称文件404问题解决办法

    Web应用程序目录下有帮助文档,是中文名称的Word文件 超链接内容如下: <a href="jsp/plugin/用户手册.doc">用户手册</a> 开 ...

  5. 网络编程 -- RPC实现原理 -- NIO单线程

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 Class : Service package lime.pri.limeNio.optimize.socket; import java.io.B ...

  6. 5 -- Hibernate的基本用法 --5 2 持久化对象的状态

    1. 瞬态 : 对象有new操作符创建,且尚未与Hibernate Session关联的对象被认为处于瞬态.瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识.如果程序中失去了瞬态对象的引用,瞬态 ...

  7. C#获取路径总结

    一.获取当前文件的路径 1.  System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName  获取模块的完整路径,包括文件名. ...

  8. eclipse去掉所有断点 恢复到默认窗口

    1.去掉所有断点 Window->Open Perspective->Debug默认是右上角的窗口中,切换到Breakpoints,如果里边有内容,那就是设置断点啦,点叉叉全部删掉就好了. ...

  9. 机器人学 —— 轨迹规划(Artificial Potential)

    今天终于完成了机器人轨迹规划的最后一次课了,拜拜自带B - BOX 的 Prof. TJ Taylor. 最后一节课的内容是利用势场来进行轨迹规划.此方法的思路非常清晰,针对Configration ...

  10. SVN创建分支主干策略

    本篇目录 前言 SVN分支管理策略 VisualSVN Server TortoiseSVN客户端 Repository的创建 Check out trunk创建新项目MyProject trunk更 ...