[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. Java内存区域和内存溢出异常

    前言 对于java程序员来说,在虚拟机自动内存管理的机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出的问题,由虚拟机管理内存,这一切看起来都很 ...

  2. C# winform 拖拽效果

    //是否在拖拽 bool isDrag = false; //鼠标相对于button控件左上角的坐标 Point contextbtnPoint = Point.Empty; private void ...

  3. 第四次上机,ASP组件的使用

    <html> <body> <% '以下连接数据库,建立一个Connection对象实例conn Set conn=Server.CreateObject("A ...

  4. SAP MM ME29N 试图取消审批报错 - Document has already been outputed(function not possible) -

    SAP MM ME29N 试图取消审批报错 - Document has already been outputed(function not possible) - 今天收到用户的一个问题,说他试图 ...

  5. arcgis api 3.x for js 入门开发系列十六迁徙流动图

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  6. javaFX笔记----ComboBox模仿qq账号下拉框删除账号

    myComboBox.setCellFactory( new Callback<ListView<String>, ListCell<String>>() { @O ...

  7. mysql No query specified

    MySQL SHOW CREATE TABLE tablename \G; 会出现 ERROR: No query specified 原因 去掉分号 ; \g \G三者选其一即可.

  8. 自定义react数据验证组件

    我们在做前端表单提交时,经常会遇到要对表单中的数据进行校验的问题.如果用户提交的数据不合法,例如格式不正确.非数字类型.超过最大长度.是否必填项.最大值和最小值等等,我们需要在相应的地方给出提示信息. ...

  9. c++11の关联容器

    一.关联容器 C++的容器类型可以分为顺序容器和关联容器两大类.对于关联容器,主要有map和set,对于这两种,根据不同的维度,衍生出了8种容器 map                        ...

  10. Host Only、NAT和Bridge三种网络连接

    Host Only.NAT和Bridge三种网络连接 在安装好了Linux镜像之后,如何连接物理机和虚拟机呢?这就需要网络连接,网络连接有三种:HostOnly.NAT.Bridge,它们都可用于Gu ...