[CTSC2017]网络

连一条长度为len的边,使得基环树的直径最小

结论:一定连在某条直径两个点上(否则更靠近不劣)

然后二分答案判定。

dp[i]:链上一个点往下延伸的最大深度

考虑对于任意两个点对最短路径都不能大于mid

就是:任意的(i<j),min(sum[j]-sum[i]+dp[i]+dp[j],len+|sumb-sumj|+|sumi-suma|+dp[i]+dp[j])<mid

前面的min比较好处理,直接按照sum+dp,dp-sum排序,双指针搞一下

不能满足前面的min的点对i,j,必然要满足后面的。

把绝对值拆开成4个,对于任意的i,j,选择的a,b都要使得这些4*k个不等式成立。

suma,sumb移项,所以4个不等式右边都要取最大的(任意转化为最值)

所以双指针的时候可以再用树状数组(为了i<j)找到4个lim

然后移项。

枚举b,sum升序降序排序,四指针维护。

每次看区间的交是否为空。

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Miracle{
const int N=1e5+;
const ll inf=0x3f3f3f3f3f3f3f3f;
int n;
struct node{
int nxt,to;
int val;
}e[*N];
int hd[N],cnt;
void add(int x,int y,int z){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
e[cnt].val=z;
hd[x]=cnt;
}
ll ans,len;
ll L,R;
int mem[N],fa[N],vf[N];
int on[N];
ll sum[N];
struct po{
ll v;
int id;
po(){}
po(ll vv,int dd){
v=vv;id=dd;
}
};
struct qs{
po p[N];
int sz;
void push(ll v,int d){
p[++sz]=po(v,d);
}
void clear(){
sz=;
}
il po &operator[](const int &x){return p[x];}
il const po &operator[](const int &x) const {return p[x];}
}su,sd,up,dw;//member's number is num bool cmpu(po a,po b){//sheng
return a.v<b.v;
}
bool cmpd(po a,po b){//jiang
return a.v>b.v;
}
int st,nd,num;
ll mx;
struct tr{
ll f[N];
void clear(){
memset(f,-0x3f,sizeof f);
}
void ins(int x,ll v){
for(;x<=n;x+=x&(-x)) f[x]=max(f[x],v);
}
ll query(int x){
ll ret=-inf;
for(;x;x-=x&(-x)) ret=max(ret,f[x]);
return ret;
}
}t[];
//t[0]:dp-sum
//t[1]:dp+sum
void dfs1(int x,ll dis){
if(dis>mx) {
mx=dis;st=x;
}
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa[x]) continue;
fa[y]=x;
dfs1(y,dis+e[i].val);
}
}
void dfs2(int x,ll dis){
if(dis>mx){
mx=dis;nd=x;
}
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa[x]) continue;
fa[y]=x;
vf[y]=e[i].val;
dfs2(y,dis+e[i].val);
}
}
ll dp[N];
void fin(int x){
dp[x]=;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa[x]||on[y]) continue;
fa[y]=x;
fin(y);
L=max(L,dp[x]+dp[y]+e[i].val);
dp[x]=max(dp[x],dp[y]+e[i].val);
}
}
struct pointer{
int ptr;
ll lim;
void clear(){
ptr=;lim=-inf;
}
void upda(ll v){
lim=max(lim,v);
}
}p[];
pair<int,int>tp;
void con(int l,int r){
tp.fi=max(tp.fi,l);
tp.se=min(tp.se,r);
}
bool che(ll mid){
///warning!!!! dp[mem[...[].id]]
t[].clear();t[].clear();
for(reg i=;i<=;++i) p[i].clear();
int ptr=;
for(reg j=;j<=num;++j){
while(ptr<num&&dw[ptr+].v+up[j].v>mid) {
++ptr;
t[].ins(dw[ptr].id,dw[ptr].v);
t[].ins(dw[ptr].id,sum[dw[ptr].id]+dp[mem[dw[ptr].id]]);
}
if(ptr){
ll djss=dp[mem[up[j].id]]-sum[up[j].id],djas=up[j].v;
ll diss=t[].query(up[j].id-),dias=t[].query(up[j].id-);
p[].upda(len-mid+djss+dias);
p[].upda(len-mid+diss+djas);
p[].upda(len-mid+dias+djas);
p[].upda(len-mid+diss+djss);
}
}
p[].ptr=p[].ptr=;
for(reg b=;b<=num;++b){
while(p[].ptr<=num&&su[p[].ptr].v-p[].lim<su[b].v) ++p[].ptr;
while(p[].ptr<num&&su[p[].ptr+].v+p[].lim<=su[b].v) ++p[].ptr;
while(p[].ptr<num&&-sd[p[].ptr+].v+p[].lim<=su[b].v) ++p[].ptr;
while(p[].ptr<=num&&-sd[p[].ptr].v-p[].lim<su[b].v) ++p[].ptr;
tp.fi=;tp.se=num;
con(p[].ptr,num);
con(,p[].ptr);
con(num-p[].ptr+,num);
con(,num-p[].ptr+);
if(tp.fi<=tp.se) return true;
}
return false;
///warning!!!! dp[mem[...[].id]]
}
void clear(){
ans=inf;num=;st=nd=;
memset(sum,,sizeof sum);
memset(fa,,sizeof fa);
memset(vf,,sizeof vf);
memset(on,,sizeof on);
memset(hd,,sizeof hd);
su.clear();sd.clear();up.clear();dw.clear();
cnt=;
L=,R=;
}
int main(){
while(){
clear();
rd(n);rd(len);
if(n==&&len==) break;
mx=-;
int x,y,z;
for(reg i=;i<n;++i){
rd(x);rd(y);rd(z);
add(x,y,z);add(y,x,z);
}
if(n==){
puts("");continue;
}
dfs1(,);
fa[st]=;
mx=-;
dfs2(st,);
/*RRR*/ R=mx;
num=;
x=nd;
while(x){
mem[++num]=x;
on[x]=;
sum[num]=sum[num-]+vf[mem[num-]];
x=fa[x];
}
memset(fa,,sizeof fa);
/*LLL*/ for(reg i=;i<=num;++i){
fin(mem[i]);
} for(reg i=;i<=num;++i){
su.push(sum[i],i);
sd.push(sum[i],i);
up.push(dp[mem[i]]+sum[i],i);
dw.push(dp[mem[i]]-sum[i],i);
}
sort(su.p+,su.p+num+,cmpu);
sort(sd.p+,sd.p+num+,cmpd);
sort(up.p+,up.p+num+,cmpu);
sort(dw.p+,dw.p+num+,cmpd); while(L<=R){
ll mid=(L+R)/;
if(che(mid)){
ans=mid;R=mid-;
}else L=mid+;
}
printf("%lld\n",ans);
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
*/

二分判定突破口

判定min的或关系。不涉及a,b的先去掉,对于剩下的任意变成最值,纯粹解不等式了。

大量运用排序+双指针。

[CTSC2017]网络的更多相关文章

  1. BZOJ 4901 [CTSC2017]网络

    题解: 只会O(n log^2 n) O(n log n)先留坑 不开long long 0 分!!!! #include<iostream> #include<cstdio> ...

  2. uoj #298. 【CTSC2017】网络

    #298. [CTSC2017]网络 一个一般的网络系统可以被描述成一张无向连通图.图上的每个节点为一个服务器,连接服务器与服务器的数据线则看作图上的一条边,边权为该数据线的长度.两个服务器之间的通讯 ...

  3. 【loj2262】【CTSC2017】网络

    题目 一颗\(n\)个点的树,求加入一条边点之后两点间最长距离的最小值 : \(n \le 100000\) ; 题解 首先加入边的两个端点一定在直径上面,先\(dfs\)拎出直径来讨论(下标只代表直 ...

  4. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  5. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  6. 网络原因导致 npm 软件包 node-sass / gulp-sass 安装失败的处理办法

    如果你正在构建一个基于 gulp 的前端自动化开发环境,那么极有可能会用到 gulp-sass ,由于网络原因你可能会安装失败,因为安装过程中部分细节会到亚马逊云服务器上获取文件.本文主要讨论在不变更 ...

  7. Virtual Box配置CentOS7网络(图文教程)

    之前很多次安装CentOS7虚拟机,每次配置网络在网上找教程,今天总结一下,全图文配置,方便以后查看. Virtual Box可选的网络接入方式包括: NAT 网络地址转换模式(NAT,Network ...

  8. 前端网络、JavaScript优化以及开发小技巧

    一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...

  9. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

随机推荐

  1. vue 单文件组件中样式加载

    在写单文件组件时,一般都是把标签.脚本.样式写到一起,这样写个人感觉有点不够简洁,所以就想着把样式分离出去. 采用import加载样式 在局部作用域(scoped)采用@import加载进来的样式文件 ...

  2. js 百度地图定位

    //百度 layer.msg('正在定位,请稍后'); var geolocation = new BMap.Geolocation({ enableHighAccuracy: true, //是否使 ...

  3. Kotlin 扩展——省略findViewById

    现在 Kotlin 安卓扩展插件能够提供与这些开源库功能相同的体验,不需要添加任何额外代码. import kotlinx.android.synthetic.main.activity_main.* ...

  4. bcrypt 安装不成功解决办法

    同一个项目,公司和家里的 node.js 的版本不同,导致项目安装依赖包时 bcrypt 安装不成功. 家里的版本为:8.11.3 公司的版本为:10.14.2 在当前项目中执行完下面两个命令后,报错 ...

  5. js实现自定义修改网页中表格信息

    项目中的打印页面,为提高用户体验,需要增自定修改表格内容的功能,以下是使用示意图(双击td标签部分的内容,可自定义修改): 以下是js插件源码,存为edit.js文件: var tbl, tbt; v ...

  6. SQLServer 日期函数及日期转换数据类型

    一.统计语句 1.--统计当前[>当天00点以后的数据] SELECT * FROM 表 WHERE CONVERT(Nvarchar, dateandtime, 111) = CONVERT( ...

  7. Java基础系列--05_面向对象

    1.概述: (1)面向过程:将问题一步一步的解决的过程(详细步骤),在C语言中所有的代码都是基于过程化的代码. (2)面向对象:面向对象是基于面向过程的编程思想,所有的事情都交由创建出来的对象去指挥. ...

  8. js常用写法

    遍历数组 ES5 写法 arr.forEach(function(value,index){ console.log(index+'--'+value); }) 遍历数组  ES6 写法 for( l ...

  9. QTableWidgetItem class

    Help on class QTableWidgetItem in module PyQt5.QtWidgets: class QTableWidgetItem(sip.wrapper)  |  QT ...

  10. centos7下安装docker(dockerfile常用的指令)

    FROM:指定ase镜像 MAINTAINER:设置镜像作者,可以是任意字符 COPY:将文件从build  context复制到镜像.支持两种形式:1.COPY src dest 2.COPY [“ ...