[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]网络的更多相关文章
- BZOJ 4901 [CTSC2017]网络
题解: 只会O(n log^2 n) O(n log n)先留坑 不开long long 0 分!!!! #include<iostream> #include<cstdio> ...
- uoj #298. 【CTSC2017】网络
#298. [CTSC2017]网络 一个一般的网络系统可以被描述成一张无向连通图.图上的每个节点为一个服务器,连接服务器与服务器的数据线则看作图上的一条边,边权为该数据线的长度.两个服务器之间的通讯 ...
- 【loj2262】【CTSC2017】网络
题目 一颗\(n\)个点的树,求加入一条边点之后两点间最长距离的最小值 : \(n \le 100000\) ; 题解 首先加入边的两个端点一定在直径上面,先\(dfs\)拎出直径来讨论(下标只代表直 ...
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- Android请求网络共通类——Hi_博客 Android App 开发笔记
今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...
- 网络原因导致 npm 软件包 node-sass / gulp-sass 安装失败的处理办法
如果你正在构建一个基于 gulp 的前端自动化开发环境,那么极有可能会用到 gulp-sass ,由于网络原因你可能会安装失败,因为安装过程中部分细节会到亚马逊云服务器上获取文件.本文主要讨论在不变更 ...
- Virtual Box配置CentOS7网络(图文教程)
之前很多次安装CentOS7虚拟机,每次配置网络在网上找教程,今天总结一下,全图文配置,方便以后查看. Virtual Box可选的网络接入方式包括: NAT 网络地址转换模式(NAT,Network ...
- 前端网络、JavaScript优化以及开发小技巧
一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...
- 猫哥网络编程系列:HTTP PEM 万能调试法
注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...
随机推荐
- Android stdio Apktool源码编译
Android Apktool源码编译 标签(空格分隔): Android Apktool 源码编译 需求 习惯NetBeans调试smali需要用Apktool反编译apk,需要用-d的参数才能生成 ...
- linux c数据库备份第五版
linux下c实现的数据库备份程序终于迎来第五版啦,这样改程序就暂告一段落啦,有点小激动呢...接下来的一周(可能两周)时间里,我会用一个小型的网络游戏(比拼99乘法)作为我学习linux c的毕业之 ...
- The ResourceConfig instance does not contain any root resource classes
问题描述 当我们在使用 myeclipse 创建 Web Service Projects 项目后,运行项目然后就会出现这个问题. 解决方案 通过这个错误描述,我们项目没有找到这个资源.报错的原因在于 ...
- NW.js使用及打包
简介 NW.js (原名 node-webkit)是一个结合了 Chromium 和 node.js 的应用运行时,通过它可以用 HTML 和 JavaScript 编写原生应用程序.它还允许开发者从 ...
- 使用Crowd集成Confluence与JIRA
一. 独立安装Crowd,步骤1-步骤13的内容二. 设置Confluence使用Crowd进行认证.步骤14-18的内容三. 设置JIRA使用Crowd进行认证,并使用Confluence的组织机构 ...
- 【xsy2479】counting 生成函数+多项式快速幂
题目大意:在字符集大小为$m$的情况下,有多少种构造长度为$n$的字符串$s$的方案,使得$C(s)=k$.其中$C(s)$表示字符串$s$中出现次数最多的字符的出现次数. 对$998244353$取 ...
- Javascript异步编程之二回调函数
上一节讲异步原理的时候基本上把回掉函数也捎带讲了一些,这节主要举几个例子来具体化一下.在开始之前,首先要明白一件事,在javascript里函数可以作为参数进行传递,这里涉及到高阶函数的概念,大家可以 ...
- 好文推荐系列--------(3)GruntJS 在线重载 提升生产率至新境界
好文原文地址:http://segmentfault.com/a/1190000000354555 本文将首先介绍grunt-markdown插件如何配合HTML模板使用,接着我将介绍如何使用grun ...
- Office_Visio_Pro_2007
Office_Visio_Pro_2007http://pan.baidu.com/share/link?shareid=473782&uk=3474501992 解压后在文件夹里找到密钥[一 ...
- 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 ...