「CF516D」 Drazil and Morning Exercise
「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的更多相关文章
- 【CF516D】Drazil and Morning Exercise
题目 首先我们知道,在树上距离一个点最远的点一定是直径的两个端点之一 首先两遍\(\rm dfs\)把直径求出来,定义\(d(u)\)表示点\(u\)距离其最远点的距离,有了直径我们就能求出\(d\) ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
- 「2014-3-18」multi-pattern string match using aho-corasick
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
- 「2014-3-17」C pointer again …
记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...
随机推荐
- 重新整理 .net core 实践篇—————配置文件之环境配置[九]
前言 在当今在互联网微服务比较适用的情况下,docker 可以说一个利器.每次我们打包docker的时候都是适用docker 的配置文件,那么配置文件里面会设置环境变量,这个时候需要我们的应用能够识别 ...
- python工业互联网应用实战17—前后端分离模式之django template vs jquery3
上一章节我们完成了"CRUD"的后面3个功能点,新增由于改动较大我们专门增加本章来阐述,主要是完成技术栈切换后,会发现模板的代码判断过多,逻辑过于复杂.对未来存在的扩展和维护友好性 ...
- ubuntu 20.04 编译安装 p 详解
事情的起因 实验需要安装 p4 环境 我考虑到我自己的电脑性能不足,因此打算在本机安装 github上官方仓库的安装教程老旧,都是在 ubuntu14.04或者ubuntu16.04 我长时间用的li ...
- python 获取当天和前几天时间数据
python 获取当天和前几天时间数据 import datetime from datetime import datetime, date, timedelta def dayDateRange( ...
- Go基础结构与类型03---标准输入与输出
package main import ( "fmt" "strconv" ) //每次接收一个用户输入 func main031() { //定义a, b两个 ...
- 给powershell增加类似于linux的alias功能
给powershell增加类似于快捷方式的功能(类似于linux的alias) 首先执行 set-executionpolicy remotesigned 允许powershell执行脚本 然后执行e ...
- 特斯拉ADAS
特斯拉ADAS Tesla 目前在Model S和Model X上面采用的自动辅助驾驶系统集成了12个超声波传感器,用来识别周围环境: 一个前置摄像头,用来辨识前方物体: 一个前置雷达,用来辨识前方物 ...
- 编译器架构Compiler Architecture(下)
编译器架构Compiler Architecture(下) Combining Scanning and Parsing 实际上没有必要将扫描(词法分析/标记化)与解析(语法分析/树生成)分开.基于P ...
- Autofac入门
注意:本文为原创文章,任何形式的转载.引用(包括但不限于以上形式)等,须先征得作者同意,否则一切后果自负. 简介 Autofac 是一个令人着迷的.NET IoC 容器. 它管理类之间的依赖关系.当应 ...
- XML文件存在中文注释报错问题( 3 字节的 UTF-8 序列的字节 3 无效)
今天在做mybatis项目的时候,给映射文件添加了中文注释后,程序就报错.把中文注释删除后,程序又可以正常执行.解决方法在下文提到. 我的xml映射文件如下: <?xml version=&qu ...