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把她最喜欢的一个二叉树模型挂在了墙上, ...
随机推荐
- codeblocks: 使用动态链接库(pcre)的配置
说明:在c/c++程序中使用动态链接库, 编译后需要相关的dll文件(如:libpcre-1.dll,libpcreposix-0.dll)才能正常的运行. 2014-06-27
- django orm跨表查询废话最少最精简版
在model.py中: class B1(models.Model): u1= models.CharField(max_length=32) #多 class B2(models.Model): f ...
- session/cookie/token
1.cookie是把登录信息存放在客户端 2.session是把登录信息存放在服务器 3.token是在登录的时候服务器提供一个令牌标识,可以存放在local storage,请求资源时带上token ...
- HomeFragment 嵌套关系
1.HomeFragment 在mainActivty 中调用: 2.HomeFragment 中: private ArrayList<Fragment> mFragments = ne ...
- MySQL数据库基础学习
MySQL基础知识 ----------- MySQL数据库简介 内存:一断电数据就没有了---------数据库:可以实现数据的持久化存储,有完整的管理系统管理,方便查询--------- DB:数 ...
- OpenDayLight——HelloWorld
OpenDayLight——HelloWorld 既然学习OpenDayLight编程这个鬼,就得像学语言一样来一个HelloWorld来试试水,经过几天的折腾,总算成功输出HelloWorld了,这 ...
- Tensorflow做阅读理解与完形填空
catalogue . 前言 . 使用的数据集 . 数据预处理 . 训练 . 测试模型运行结果: 进行实际完形填空 0. 前言 开始写这篇文章的时候是晚上12点,突然想到几点新的理解,赶紧记下来.我们 ...
- 网络编程基础【day09】:socketserver进阶(十)
本节内容 1.概述 2.多用户并发 3.socketserver.BaseServer 一.概述 之前上一篇写的 day8-socketserver使用 讲解了socketsever如何使用,但是在最 ...
- java io系列22之 FileReader和FileWriter
FileReader 是用于读取字符流的类,它继承于InputStreamReader.要读取原始字节流,请考虑使用 FileInputStream.FileWriter 是用于写入字符流的类,它继承 ...
- jquery validate 详解二
原文:http://blog.sina.com.cn/s/blog_608475eb0100h3h2.html 这里只是第二篇,前面的内容请参阅上一篇 五.常用方法及注意问题 1.用其他方式替代默认的 ...