正解: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. 【WPF】点击滑动条(Slider),移动滑块(Tick)到鼠标点击的位置

    问题:点击Slider控件时,滑块会自动跳到滑动条的最边缘位置,无法跳到鼠标点击的位置上. 办法:给Slider控件设置属性IsMoveToPointEnabled="True"即 ...

  2. [开发笔记]-Jqplot图表初体验

    文章内容为初次使用Jqplot图表插件的测试代码,仅供参考. <html xmlns="http://www.w3.org/1999/xhtml"> <head& ...

  3. java反编译工具(Java Decompiler)

    1,下载地址,包括GUI,Eclipse插件 http://jd.benow.ca/ 2,Eclipse插件的安装参看 https://blog.csdn.net/yh_zeng2/article/d ...

  4. Oracle分析函数-排序排列(rank、dense_rank、row_number、ntile)

    (1)rank函数返回一个唯一的值,除非遇到相同的数据时,此时所有相同数据的排名是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名. (2)dense_rank函数返回一个唯一的值, ...

  5. Java知多少(53)使用Java创建自己的异常子类

    尽管Java的内置异常处理大多数常见错误,你也许希望建立你自己的异常类型来处理你所应用的特殊情况.这是非常简单的:只要定义Exception的一个子类就可以了(Exception当然是Throwabl ...

  6. centos下安装Loadrunner

    背景: 网上的资料呀,真是浑水摸鱼的多,有些人直接拷贝别人的帖子,这样有啥意思呢,只会让别人要搜索的时候,更扰乱些! 这里我不写步骤,我用shell把步骤弄了一下,看的懂的看,看不懂的留言吧.就酱,看 ...

  7. vector的多套遍历方案

    1.迭代器 begin,end,*it++ 2.下标法 3.at函数(GetAt) 4.指针法 指针移到头部rewind.

  8. SpringBoot(十四)-- 整合Swagger2

    1.pom依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-s ...

  9. [Linux] 设置系统时区

    1. 检查当前时区 以 root 身份登录. # date Fri Sep :: UTC 其中 UTC 是指当前使用的时间系统为世界标准时间,也称世界协调时间.英文名称为 Coordinated Un ...

  10. mkvirtualenv command not found解决

    在京东云上用户家目录下创建.virtualenvs后,创建python虚拟环境,使用mkvirtualenv命令,没有提示,输完回车报下面错误,mkvirtualenv command not fou ...