二分答案$mid$,若存在一条路径满足$|ave-k|<mid$,则答案至多为$mid-1$。

若$ave\leq k$,则$\sum(w-k)\leq 0$,且$\sum(k-w-mid)<0$;若$ave\geq k$,那么同理。

预先树分治处理出所有到重心的路径的信息,并按$w-k$排序。

那么每次检查的时候,通过双指针满足第一个限制,维护最小值来满足第二个限制。

需要注意的是,不能选取两条来自同一棵子树的路径,这只需要维护来自不同子树的最小的两条路径即可。

时间复杂度$O(n\log n(\log n+\log w))$。

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=50010,M=1000010;
int n,i,x,y,g[N],nxt[N<<1],v[N<<1],ok[N<<1],ed,son[N],f[N],all,now;
ll z,K,w[N<<1],val[M],L,R,mid;
int st[N],en[N],cnt,cur;
struct P{ll x;int y,z;P(){}P(ll _x,int _y,int _z){x=_x,y=_y,z=_z;}}q[2][M];
inline bool cmp(const P&a,const P&b){return a.x<b.x;}
inline void add(int x,int y,ll z){v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;ok[ed]=1;}
void findroot(int x,int y){
son[x]=1;f[x]=0;
for(int i=g[x];i;i=nxt[i])if(ok[i]&&v[i]!=y){
findroot(v[i],x);
son[x]+=son[v[i]];
if(son[v[i]]>f[x])f[x]=son[v[i]];
}
if(all-son[x]>f[x])f[x]=all-son[x];
if(f[x]<f[now])now=x;
}
void dfs(int x,int y,ll a,int b,int c){
q[0][++cur]=P(a,b,c);
q[1][cur]=P(-a,b,c);
for(int i=g[x];i;i=nxt[i])if(ok[i]&&v[i]!=y)dfs(v[i],x,a+w[i]-K,b+1,c);
}
void solve(int x){
int i,o=++cnt;
st[o]=cur+1;
for(i=g[x];i;i=nxt[i])if(ok[i])dfs(v[i],x,w[i]-K,1,v[i]);
en[o]=cur;
for(i=0;i<2;i++)sort(q[i]+st[o],q[i]+en[o]+1,cmp);
for(i=g[x];i;i=nxt[i])if(ok[i]){
ok[i^1]=0;
f[0]=all=son[v[i]];
findroot(v[i],now=0);
solve(now);
}
}
inline bool check(){
for(int i=0;i<2;i++){
for(int j=1;j<=cur;j++){
val[j]=-q[i][j].x-mid*q[i][j].y;
if(q[i][j].x<=0&&val[j]<0)return 1;
}
for(int j=1;j<=cnt;j++){
int l=st[j],r=en[j],x=r,y=l,az=0,bz=0;ll av,bv;
for(;x>=l;x--){
for(;y<=r&&q[i][x].x+q[i][y].x<=0;y++){
ll v=val[y];int z=q[i][y].z;
if(az==z){if(av>v)av=v;}
else if(!az||av>v)bv=av,bz=az,av=v,az=z;
else if(!bz||bv>v)bv=v,bz=z;
}
if(az&&az!=q[i][x].z&&val[x]+av<0)return 1;
if(bz&&bz!=q[i][x].z&&val[x]+bv<0)return 1;
}
}
}
return 0;
}
int main(){
scanf("%d%lld",&n,&K);
for(ed=i=1;i<n;i++)scanf("%d%d%lld",&x,&y,&z),add(x,y,z),add(y,x,z);
f[0]=all=n;findroot(1,now=0);solve(now);
L=1,R=1e13;
while(L<=R){
mid=(L+R)>>1;
if(check())R=mid-1;else L=mid+1;
}
return printf("%lld",R),0;
}

  

BZOJ4738 : 汽水的更多相关文章

  1. 【BZOJ4738/UOJ#276】汽水(点分治,分数规划)

    [BZOJ4738/UOJ#276]汽水(点分治,分数规划) 题面 BZOJ UOJ 题解 今天考试的题目,虽然说是写完了,但是感觉还是半懂不懂的来着. 代码基本照着\(Anson\)爷的码的,orz ...

  2. 用java代码解决10元喝多少瓶汽水的问题

    问题:汽水2元一瓶,四个盖子换一瓶,两个空瓶一瓶,问10元可以喝几瓶?(不许借别人空瓶或瓶盖,但可以先喝汽水再付空酒瓶或瓶盖) 最近同事让笔者看了一道脑筋急转弯的数学题,当然不是很难,只要会加减法应该 ...

  3. 英语影视台词---无敌破坏王2大脑互联网(3)((Ralph)我们去喝根汁汽水吧)

    英语影视台词---无敌破坏王2大脑互联网(3)((Ralph)我们去喝根汁汽水吧) 一.总结 一句话总结: Let's go get a root beer. 1.(Ralph)让我来瞧瞧你的本事  ...

  4. [UOJ#276]【清华集训2016】汽水

    [UOJ#276][清华集训2016]汽水 试题描述 牛牛来到了一个盛产汽水的国度旅行. 这个国度的地图上有 \(n\) 个城市,这些城市之间用 \(n−1\) 条道路连接,任意两个城市之间,都存在一 ...

  5. [原创]JAVA解决喝汽水问题

    问题:一瓶汽水单价2.5元,四个瓶盖或者两个瓶子可以换取一瓶汽水.给定金额得出一共能喝几瓶汽水? 实现: #cat drink.java import java.io.BufferedReader; ...

  6. Java实现空瓶换汽水

    1 空瓶换汽水 浪费可耻,节约光荣.饮料店节日搞活动:不用付费,用3个某饮料的空瓶就可以换一瓶该饮料.刚好小明前两天买了2瓶该饮料喝完了,瓶子还在.他耍了个小聪明,向老板借了一个空瓶,凑成3个,换了一 ...

  7. UOJ#276. 【清华集训2016】汽水 二分答案 点分治

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ276.html 题解 首先,读入的时候就将所有的 $w_i$ 减掉 $k$ . 于是我们要求的就是平均值最 ...

  8. UOJ276 [清华集训2016] 汽水 【二分答案】【点分治】【树状数组】

    题目分析: 这种乱七八糟的题目一看就是点分治,答案有单调性,所以还可以二分答案. 我们每次二分的时候考虑答案会不会大于等于某个值,注意到系数$k$是无意义的,因为我们可以通过转化使得$k=0$. 合并 ...

  9. UOJ #276「清华集训2016」汽水

    为什么你们常数都这么小啊 UOJ #276 题意:在树上找一条链使得|边权平均值$ -k$|尽量小,$ n<=5e4$ $ Solution:$ 首先二分答案$ ans$,即我们需要找一条链使得 ...

随机推荐

  1. .gz解压

    1.今天很神奇我遇到这样的压缩包,啧啧啧,好少见的,记录下 gzip  -d  http_log.gz 这是讲http_log文件解压到当前的路径下

  2. HDU 1541 STAR(树状数组)

    Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  3. Ubuntu点击dash home就崩溃

    很崩溃的一个问题,搞了好久.并没有很清楚的知道具体哪个细节导致的问题,只是大概知道了原因,以及搞出了一个解决方案. 问题描述 台式机,没有独立显卡,也就是只有一个intel CPU在一起的小破显卡(我 ...

  4. machinekey生成工具 v1.0 官方最新版

    http://www.33lc.com/soft/66056.html 电信下载 广东电信下载 厦门电信下载 湖北电信下载 江苏电信下载 网通下载 陕西网通下载 山东网通下载 甘肃网通下载 山西网通下 ...

  5. word/excel/cad中插入二维码

    1.有需求为在word文档中插入二维码,寻访度娘后,大部分人推荐使用QRmaker制作. 2.找寻QRmaker,网上很多都是1.1版本,后来才知道这个版本有问题(对中文支持不好),偶然得到1.3的版 ...

  6. 【转】Windows Server 2008 R2下安装 .net framework3.5

    原文地址:http://hi.baidu.com/tonny_dxf/item/6831bcdc3d7c06e7b2f7777c      [你必须用角色管理工具安装.net framework3.5 ...

  7. JMeter执行压测输出HTML图形化报表(二)

    命令行模式将jtl转成测试图表 注意此方法只使用jmeter3.0以后版本 第一种:在测试过程中将jtl转成测试报告(在jmeter的bin目录下执行) jmeter -n -t baidu_requ ...

  8. hbase0.94.11版本和hbase1.4.9版本的benchamark区别

    1.起初使用ycsb对hbase进行benchmark,分别在100%写的情况下检测写性能:在100%读的情况下检测读的性能.实验数据如下: 2.新版本的habse写性能竟然不如老版本.!!!.于是我 ...

  9. Codeforces 802I Fake News (hard) (SA+单调栈) 或 SAM

    原文链接http://www.cnblogs.com/zhouzhendong/p/9026184.html 题目传送门 - Codeforces 802I 题意 求一个串中,所有本质不同子串的出现次 ...

  10. js设置元素不能编辑

    js设置元素不能编辑 $("#startLocation").attr("readOnly",true); js设置元素可以编辑 $("#startL ...