正解: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的binlog日志<转>

    binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日 ...

  2. ipv6禁用导致rpcbind服务启动失败实例

    ipv6禁用导致rpcbind服务启动失败实例     昨天在做服务器磁盘分区扩容的时候出现过一个服务启动的问题,在此记录.情景再现:前天晚上申请做磁盘扩容,得到批准后,昨天早上5点开始做停机调整维护 ...

  3. LVS DR模式搭建 keepalived lvs

    LVS DR模式搭建• 三台机器 • 分发器,也叫调度器(简写为dir)172.16.161.130 • rs1 172.16.161.131 • rs2 172.16.161.132 • vip 1 ...

  4. How can I get the baseurl of site?

    string baseUrl = Request.Url.Scheme + "://" + Request.Url.Authority +Request.ApplicationPa ...

  5. Python 中filter函数用法

    filter()和map一样,接收一个函数和一个序列.和map不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素 过滤出奇数: de ...

  6. 仿迅雷播放器教程 -- C++ 100款开源界面库 (10)

      (声明:Alberl以后说到开源库,一般都是指著名的.或者不著名但维护至少3年以上的.那些把代码一扔就没下文的,Alberl不称之为开源库,只称为开源代码.这里并不是贬低,像Alberl前面那个系 ...

  7. duilib进阶教程 -- Container控件 (3)

    前面两个教程的目的是教大家与MFC结合,那么从这篇起,将不再使用MFC,而使用纯win32项目,本文的所有知识已经在<duilib入门教程>里面讲过了,因此基础知识不再赘述. 代码下载:h ...

  8. Flv的结构分析

    Flv是网络上流行的非常广的一种媒体格式,很多大型媒体网站都在使用这种格式承载音视频信息,比如优酷等网站. Flv文件格式相对而言还是比较简单的,主要是由两部分组成 FLV header FLV bo ...

  9. Spark LogisticRegression 逻辑回归之简介

    LogisticRegression简介

  10. electron 主进程,和渲染进程的通信

    ipcMain https://electronjs.org/docs/api/ipc-main 当在主进程中使用时,它处理从渲染器进程(网页)发送出来的异步和同步信息, 当然也有可能从主进程向渲染进 ...