「CF516D」 Drazil and Morning Exercise

传送门

这个 \(f_i\) 显然可以通过树形 \(\texttt{DP}\) 直接求。

然后看到这种差值问题感觉就可以二分转换为判定性问题。

哦不好像本来就是判定性问题

显然我们可以考虑枚举最小值,然后检查其他点的合法情况,然后最后查最小值所在连通块大小即可。

这样做是 \(O(n^2\alpha(n))\) 的。

考虑优化。我们猜想这个 \(f\) 一定有性质。

注意到当最小值单调不降的时候,最大值一定也单调不降,也即是说,我们需要确定一个顺序使得我们可以用一个类似于双指针的过程来寻找答案。

有一个非常显然的结论:\(f\) 值最小的节点一定是直径的中点或中点左右的实际节点。

那么有这个东西之后我们可以推得:若以这个点为根,那么一定有 \(f_u<f_{fa_u}\),证明非常简单。

实际上实现的过程中,我们可以对最大值进行枚举,因为最大值的缺失一定不会影响当前连通块的连通性,相当于是以这个 \(f\) 值最小的点为根的某颗子树的叶节点,直接将子树大小减一即可。

然后这个题就完了。

/*---Author:HenryHuang---*/
/*---Never Settle---*/
/*---Never Enough---*/
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
typedef long long ll;
struct edge{
int to,nex,w;
}e[maxn<<1];
int head[maxn],cnt;
void add(int a,int b,int c){
e[++cnt]=(edge){b,head[a],c};
head[a]=cnt;
}
ll f[maxn],g1[maxn],g2[maxn],cho[maxn];
int ff[maxn];
void dfs1(int u,int fa){
for(int i=head[u];i;i=e[i].nex){
int v=e[i].to;
if(v==fa) continue;
dfs1(v,u);
if(e[i].w+g1[v]>g1[u]){
g2[u]=g1[u];
g1[u]=e[i].w+g1[v];
cho[u]=v;
}
else g2[u]=max(g2[u],e[i].w+g1[v]);
}
}
void dfs2(int u,int fa){
for(int i=head[u];i;i=e[i].nex){
int v=e[i].to;
if(v==fa) continue;
if(cho[u]==v) f[v]=max(f[u],g2[u])+e[i].w;
else f[v]=max(f[u],g1[u])+e[i].w;
dfs2(v,u);
}
}
void dfs3(int u,int fa){
ff[u]=fa;
for(int i=head[u];i;i=e[i].nex){
int v=e[i].to;
if(v==fa) continue;
dfs3(v,u);
}
}
int fa[maxn],siz[maxn],id[maxn];
int getfa(int t){
if(fa[t]==t) return fa[t];
return fa[t]=getfa(fa[t]);
}
void merge(int x,int y){
x=getfa(x),y=getfa(y);
fa[y]=x,siz[x]+=siz[y];
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n;cin>>n;
for(int i=1;i<n;++i){
int a,b,c;cin>>a>>b>>c;
add(a,b,c),add(b,a,c);
}
dfs1(1,0);
dfs2(1,0);
for(int i=1;i<=n;++i) f[i]=max(f[i],g1[i]);
int mn=1;
for(int i=1;i<=n;++i)
if(f[i]<f[mn]) mn=i;
for(int i=1;i<=n;++i) id[i]=i;
sort(id+1,id+n+1,[&](int x,int y){return f[x]<f[y];});
dfs3(mn,0);
int q;cin>>q;
while(q--){
ll num;cin>>num;
for(int i=1;i<=n;++i) fa[i]=i,siz[i]=1;
int l=n,ans=0;
for(int r=n;r>=1;--r){
while(f[id[r]]-f[id[l]]<=num&&l>1){
--l;
if(f[id[r]]-f[id[l]]<=num){
for(int i=head[id[l]];i;i=e[i].nex){
int v=e[i].to;
if(v==ff[id[l]]) continue;
merge(id[l],v);
}
ans=max(ans,siz[getfa(id[l])]);
}
else{
++l;
break;
}
}
--siz[getfa(id[r])];
}
cout<<ans<<'\n';
}
return 0;
}

「CF516D」 Drazil and Morning Exercise的更多相关文章

  1. 【CF516D】Drazil and Morning Exercise

    题目 首先我们知道,在树上距离一个点最远的点一定是直径的两个端点之一 首先两遍\(\rm dfs\)把直径求出来,定义\(d(u)\)表示点\(u\)距离其最远点的距离,有了直径我们就能求出\(d\) ...

  2. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  3. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  4. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  5. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  6. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  7. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  8. 「2014-3-18」multi-pattern string match using aho-corasick

    我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...

  9. 「2014-3-17」C pointer again …

    记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...

随机推荐

  1. docker私有仓库搭建及使用

      1.下载官方镜像 sudo docker pull registry 下载完成后,docker images可以查看到pull下来的镜像registry 2.启动registry容器,用于提供私有 ...

  2. GO学习-(36) Go语言在select语句中实现优先级

    Go语言在select语句中实现优先级 Go语言在select语句中实现优先级 select语句介绍 Go 语言中的 select语句用于监控并选择一组case语句执行相应的代码.它看起来类似于swi ...

  3. modelMapper使用,将数据库查询对象直接转成DTO对象

    1.pom引入 <dependency> <groupId>org.modelmapper</groupId> <artifactId>modelmap ...

  4. NNVM Compiler,AI框架的开放式编译器

    NNVM Compiler,AI框架的开放式编译器 深度学习已变得无处不在且不可或缺.在多种平台(例如手机,GPU,IoT设备和专用加速器)上部署深度学习工作负载的需求不断增长.宣布了TVM堆栈,以弥 ...

  5. TensorFlow文本情感分析实现

    TensorFlow文本情感分析实现 前面介绍了如何将卷积网络应用于图像.本文将把相似的想法应用于文本. 文本和图像有什么共同之处?乍一看很少.但是,如果将句子或文档表示为矩阵,则该矩阵与其中每个单元 ...

  6. Caffe框架GPU与MLU计算结果不一致请问如何调试?

    Caffe框架GPU与MLU计算结果不一致请问如何调试? 某一检测模型移植到Cambricon Caffe上时,发现无法检测出结果,于是将GPU和MLU的运行结果输出并保存后进行对比,发现二者计算结果 ...

  7. Linux内存技术分析(下)

    Linux内存技术分析(下) 五.内存使用场景 out of memory 的时代过去了吗?no,内存再充足也不可任性使用. 1.内存的使用场景 page 管理 slab(kmalloc.内存池) 用 ...

  8. Jmeter-逻辑控制器If Controller的实例运用

    一.If Controller概述 Expression (must evaluate to true or false) :表达式(值必须是true或false),也就是说,在右边文本框中输入的条件 ...

  9. SpringCloud 面试题 (持续更新、吐血推荐)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  10. Spring Boot WebFlux-04——WebFlux 整合 Thymeleaf

    第04课:WebFlux 整合 Thymeleaf 上一篇介绍的是用 MongoDB 来实现 WebFlux 对数据源的操作,那么有了数据需要渲染到前台给用户展示,这就是本文关心的 View 层,Vi ...