[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. Android stdio Apktool源码编译

    Android Apktool源码编译 标签(空格分隔): Android Apktool 源码编译 需求 习惯NetBeans调试smali需要用Apktool反编译apk,需要用-d的参数才能生成 ...

  2. linux c数据库备份第五版

    linux下c实现的数据库备份程序终于迎来第五版啦,这样改程序就暂告一段落啦,有点小激动呢...接下来的一周(可能两周)时间里,我会用一个小型的网络游戏(比拼99乘法)作为我学习linux c的毕业之 ...

  3. The ResourceConfig instance does not contain any root resource classes

    问题描述 当我们在使用 myeclipse 创建 Web Service Projects 项目后,运行项目然后就会出现这个问题. 解决方案 通过这个错误描述,我们项目没有找到这个资源.报错的原因在于 ...

  4. NW.js使用及打包

    简介 NW.js (原名 node-webkit)是一个结合了 Chromium 和 node.js 的应用运行时,通过它可以用 HTML 和 JavaScript 编写原生应用程序.它还允许开发者从 ...

  5. 使用Crowd集成Confluence与JIRA

    一. 独立安装Crowd,步骤1-步骤13的内容二. 设置Confluence使用Crowd进行认证.步骤14-18的内容三. 设置JIRA使用Crowd进行认证,并使用Confluence的组织机构 ...

  6. 【xsy2479】counting 生成函数+多项式快速幂

    题目大意:在字符集大小为$m$的情况下,有多少种构造长度为$n$的字符串$s$的方案,使得$C(s)=k$.其中$C(s)$表示字符串$s$中出现次数最多的字符的出现次数. 对$998244353$取 ...

  7. Javascript异步编程之二回调函数

    上一节讲异步原理的时候基本上把回掉函数也捎带讲了一些,这节主要举几个例子来具体化一下.在开始之前,首先要明白一件事,在javascript里函数可以作为参数进行传递,这里涉及到高阶函数的概念,大家可以 ...

  8. 好文推荐系列--------(3)GruntJS 在线重载 提升生产率至新境界

    好文原文地址:http://segmentfault.com/a/1190000000354555 本文将首先介绍grunt-markdown插件如何配合HTML模板使用,接着我将介绍如何使用grun ...

  9. Office_Visio_Pro_2007

    Office_Visio_Pro_2007http://pan.baidu.com/share/link?shareid=473782&uk=3474501992 解压后在文件夹里找到密钥[一 ...

  10. TensorFlow学习(&#39;utf-8&#39; codec can&#39;t decode byte 0xff in position 0: invalid start byte)

    使用语句: image_raw_data = tf.gfile.GFile("./picture.jpg", "r").read() 读取图像时报错如下: Un ...