UOJ #276「清华集训2016」汽水
为什么你们常数都这么小啊
题意:在树上找一条链使得|边权平均值$ -k$|尽量小,$ n<=5e4$
$ Solution:$
首先二分答案$ ans$,即我们需要找一条链使得边权平均值 $\in [-ans,ans]$
我们分正负两半分开讨论
先假设平均值$ \in (0,ans]$
将原树点分
统计过根的所有链
将这些链记录长度$len$,边数$sum$,所属子树标号$id$之后按长度排序
添加一条链$(0,0,0)$,则过某点的链一定是某两条不在同一子树的链拼接而成
两条链拼接合法当且仅当$ \frac{len_i+len_j}{sum_i+sum_j} \in (0,ans]$
化简得$ len_i+len_j>0且len_i-ans·sum_i+len_j-ans·sum_j \leq 0$
我们记录后缀$ len_i-ans·sum_i$的最小值
然后两个指针扫扫就好了
注意存在不在同一子树的限制,我们需要同时记录不在同一子树的后缀最小值和次小值,这样才能合并
如果平均值$ \in [-ans,0]$,也用同样的方法维护前缀最大值和次大值即可
注意各种边界的问题
时间复杂度:$ O(n \ log \ n \ log \ val)$
$ my \ code$
#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#define M 100010
#define rt register int
#define ll long long
using namespace std;
inline ll read(){
ll x = ; char zf = ; char ch = getchar();
while (ch != '-' && !isdigit(ch)) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (isdigit(ch)) x = x * + ch - '', ch = getchar(); return x * zf;
}
void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ll y){write(y);putchar('\n');}
int i,j,k,m,n,x,y,z,cnt,all,Root,nowmin;
int F[M],L[M],N[M],a[M],size[M];ll c[M];
bool vis[M];
void add(int x,int y,ll z){
a[++k]=y;c[k]=z;
if(!F[x])F[x]=k;
else N[L[x]]=k;
L[x]=k;
}
void getRoot(int x,int pre){
size[x]=;int Maxsize=;
for(rt i=F[x];i;i=N[i])if(a[i]!=pre&&!vis[a[i]]){
getRoot(a[i],x);size[x]+=size[a[i]];
Maxsize=max(Maxsize,size[a[i]]);
}
Maxsize=max(Maxsize,all-size[x]);
if(Maxsize<nowmin)nowmin=Maxsize,Root=x;
}
int cs;
vector<int>e[];
void build(int x){
int ls=all;vis[x]=;
for(rt i=F[x];i;i=N[i])if(!vis[a[i]]){
all=(size[a[i]]>size[x]?ls-size[x]:size[a[i]]);
nowmin=;Root=;getRoot(a[i],x);
e[x].push_back(Root);
build(Root);
}
}
struct chain{
ll len;int sl,col;
bool operator <(const chain s)const{
return len<s.len;
}
}q[];int t;
void Add(int col,int x,int pre,ll len,int sl){
q[++t]={len,sl,col};
for(rt i=F[x];i;i=N[i])if(a[i]!=pre&&!vis[a[i]])Add(col,a[i],x,len+c[i],sl+);
}
int qzmax[][],hzmin[][],allsize=;
bool check(int x,ll ans){//0...x
q[t=]={,,};vis[x]=;
for(rt i=F[x];i;i=N[i])if(!vis[a[i]])Add(a[i],a[i],x,c[i],);
sort(q+,q+t+);
qzmax[][]=;qzmax[][]=;
for(rt i=;i<=t;i++){
int id0=qzmax[i-][],id1=qzmax[i-][];
qzmax[i][]=id0;qzmax[i][]=id1;
if(q[i].len+ans*q[i].sl>q[id0].len+ans*q[id0].sl){
if(q[i].col!=q[id0].col)qzmax[i][]=qzmax[i][];
qzmax[i][]=i;
}
else if(q[i].len+ans*q[i].sl>q[id1].len+ans*q[id1].sl||!id1){
if(q[i].col!=q[id0].col)qzmax[i][]=i;
}
}
hzmin[t][]=t;hzmin[t][]=;
for(rt i=t-;i>=;i--){
int id0=hzmin[i+][],id1=hzmin[i+][];
hzmin[i][]=id0;hzmin[i][]=id1;
if(q[i].len-ans*q[i].sl<q[id0].len-ans*q[id0].sl){
if(q[i].col!=q[id0].col)hzmin[i][]=hzmin[i][];
hzmin[i][]=i;
}
else if(q[i].len-ans*q[i].sl<q[id1].len-ans*q[id1].sl||!id1){
if(q[i].col!=q[id0].col)hzmin[i][]=i;
}
}
int R=t;
for(rt i=;i<=t;i++){
while((q[i].len+q[R].len>||R==i)&&R)R--;
if(R==)break;if(R>=i)continue;
int maxv=qzmax[R][];
if(q[qzmax[R][]].col==q[i].col)maxv=qzmax[R][];
if(maxv==)continue;
if(q[i].len+q[i].sl*ans+q[maxv].len+ans*q[maxv].sl>)return ;
}
int L=;
for(rt i=t;i>=;i--){
while((q[i].len+q[L].len<||L==i)&&L<=t)L++;
if(L>t)break;if(L<=i)continue;
int minv=hzmin[L][];
if(q[hzmin[L][]].col==q[i].col)minv=hzmin[L][];
if(!minv)continue;
if(q[i].len-q[i].sl*ans+q[minv].len-ans*q[minv].sl<)return ;
}
bool res=;
for(rt i=;i<e[x].size();i++)if(!res)res|=check(e[x][i],ans);
return res;
}
int main(){
n=read();ll w=read();
for(rt i=;i<n;i++){
x=read();y=read();ll z=read();
add(x,y,z-w);
add(y,x,z-w);
}
nowmin=;all=n;getRoot(,);
int troot=Root;build(Root);
memset(vis,,sizeof(vis));
ll L=,R=;
while(L<=R){
memset(vis,,sizeof(vis));
ll mid=(L+R)/;
if(check(troot,mid))R=mid-;
else L=mid+;
}
write(R);
return ;
}
UOJ #276「清华集训2016」汽水的更多相关文章
- [UOJ#276]【清华集训2016】汽水
[UOJ#276][清华集训2016]汽水 试题描述 牛牛来到了一个盛产汽水的国度旅行. 这个国度的地图上有 \(n\) 个城市,这些城市之间用 \(n−1\) 条道路连接,任意两个城市之间,都存在一 ...
- UOJ#276. 【清华集训2016】汽水 二分答案 点分治
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ276.html 题解 首先,读入的时候就将所有的 $w_i$ 减掉 $k$ . 于是我们要求的就是平均值最 ...
- uoj#276. 【清华集训2016】汽水(分数规划+点分治)
传送门 没想到点分治那一层-- 首先不难发现这是个分数规划,先把所有的边长减去\(k\),二分答案,设为\(mid\),就是要求路径平均值\(ans\in[-mid,mid]\) 先来考虑\(ans\ ...
- UOJ #36「清华集训2014」玛里苟斯
这怎么想得到啊......... UOJ #36 题意:求随机一个集合的子集的异或和的$k$次方的期望值,保证答案$ \lt 2^{63},1 \leq k \leq 5$ $ Solution:$ ...
- UOJ #2321. 「清华集训 2017」无限之环
首先裂点表示四个方向 一条边上都有插头或者都不有插头,相当于满足流量平衡 最大流 = 插头个数*2时有解 然后求最小费用最大流 黑白染色分别连原点汇点
- UOJ 275. 【清华集训2016】组合数问题
UOJ 275. [清华集训2016]组合数问题 组合数 $C_n^m $表示的是从 \(n\) 个物品中选出 \(m\) 个物品的方案数.举个例子,从$ (1,2,3)(1,2,3)$ 三个物品中选 ...
- UOJ #269. 【清华集训2016】如何优雅地求和
UOJ #269. [清华集训2016]如何优雅地求和 题目链接 给定一个\(m\)次多项式\(f(x)\)的\(m+1\)个点值:\(f(0)\)到\(f(m)\). 然后求: \[ Q(f,n,x ...
- Loj #2331. 「清华集训 2017」某位歌姬的故事
Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...
- Loj #2324. 「清华集训 2017」小 Y 和二叉树
Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...
随机推荐
- sublime安装说明
安装Install package https://www.cnblogs.com/lixuwu/p/5693624.html 常用配置 Perference → Settings – User,用下 ...
- ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql
转: ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql 本文为博主原创,转载请注明出处. 在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时 ...
- struts2 对EL的改变
Struts2对EL的改变 1.Struts2中使用EL的问题: 前提: 我们应该知道,如果我们没有往值栈(根)中放入数据的话,那么我们的动作类默认是在值栈的栈顶 2.关于EL问题的分析: 分析: ...
- JS with
<script type="text/javascript"> function Dog(){ this.type="dog"; this.tail ...
- CSS文档统筹
一.CSS文档统筹 1.整站里相同的CSS样式提取到一个样式表里,各个页面调用相同的样式文件即可: 2.网站较大的情况下一般会把网站的头部,尾部单独分离出来,包括样式文件: 1)根据页面类型分离文件 ...
- jQuery中mouseleave和mouseout的区别详解
很多人在使用jQuery实现鼠标悬停效果时,一般都会用到mouseover和mouseout这对事件.而在实现过程中,可能会出现一些不理想的状况. 先看下使用mouseout的效果: <p> ...
- day-02(css,js)
本文档并非个人所写,只是便于参考:回顾: html: 作用:展示 文件标签: <html> <head> <title></title> </he ...
- busybox(一)浅析
目录 busybox(一)浅析 引入 读取inittab 创建执行脚本链表 执行脚本 小结 title: busybox(一)浅析 tag: arm date: 2018-11-13 23:02:33 ...
- Hadoop记录-技术网站
Grafan监控:http://docs.grafana.org/ Tez:http://tez.apache.org/install.html 阿里巴巴镜像:https://opsx.alibaba ...
- linux xargs【转】
-i -I 参数区别 http://man.linuxde.net/xargs 它们都是用来作参数扩展替换的,以下两句代码其实效果一样 cat arg.txt|xargs -i sh sk.sh -p ...