[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=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/10)output(x/10);putchar(x%10+'0');}
template<class T>il void ot(T x){if(x<0) 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+5;
const ll inf=0x3f3f3f3f3f3f3f3f;
int n;
struct node{int nxt,to;int val;
}e[2*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=0;}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 numbool cmpu(po a,po b){//shengreturn a.v<b.v;
}
bool cmpd(po a,po b){//jiangreturn 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[2];
//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]=0;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=0;lim=-inf;}void upda(ll v){lim=max(lim,v);}
}p[5];
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[0].clear();t[1].clear();for(reg i=1;i<=4;++i) p[i].clear();int ptr=0;for(reg j=1;j<=num;++j){while(ptr<num&&dw[ptr+1].v+up[j].v>mid) {++ptr;t[0].ins(dw[ptr].id,dw[ptr].v);t[1].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[0].query(up[j].id-1),dias=t[1].query(up[j].id-1);p[1].upda(len-mid+djss+dias);p[2].upda(len-mid+diss+djas);p[3].upda(len-mid+dias+djas);p[4].upda(len-mid+diss+djss);}}p[1].ptr=p[4].ptr=1;for(reg b=1;b<=num;++b){while(p[1].ptr<=num&&su[p[1].ptr].v-p[1].lim<su[b].v) ++p[1].ptr;while(p[2].ptr<num&&su[p[2].ptr+1].v+p[2].lim<=su[b].v) ++p[2].ptr;while(p[3].ptr<num&&-sd[p[3].ptr+1].v+p[3].lim<=su[b].v) ++p[3].ptr;while(p[4].ptr<=num&&-sd[p[4].ptr].v-p[4].lim<su[b].v) ++p[4].ptr;tp.fi=1;tp.se=num;con(p[1].ptr,num);con(1,p[2].ptr);con(num-p[3].ptr+1,num);con(1,num-p[4].ptr+1);if(tp.fi<=tp.se) return true;}return false;///warning!!!! dp[mem[...[].id]]
}
void clear(){ans=inf;num=0;st=nd=0;memset(sum,0,sizeof sum);memset(fa,0,sizeof fa);memset(vf,0,sizeof vf);memset(on,0,sizeof on);memset(hd,0,sizeof hd);su.clear();sd.clear();up.clear();dw.clear();cnt=0;L=0,R=0;
}
int main(){while(1){clear();rd(n);rd(len);if(n==0&&len==0) break;mx=-1;int x,y,z;for(reg i=1;i<n;++i){rd(x);rd(y);rd(z);add(x,y,z);add(y,x,z);}if(n==1){puts("0");continue;}dfs1(1,0);fa[st]=0;mx=-1;dfs2(st,0);
/*RRR*/ R=mx;num=0;x=nd;while(x){mem[++num]=x;on[x]=1;sum[num]=sum[num-1]+vf[mem[num-1]];x=fa[x];}memset(fa,0,sizeof fa);
/*LLL*/ for(reg i=1;i<=num;++i){fin(mem[i]);}for(reg i=1;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+1,su.p+num+1,cmpu);sort(sd.p+1,sd.p+num+1,cmpd);sort(up.p+1,up.p+num+1,cmpu);sort(dw.p+1,dw.p+num+1,cmpd);while(L<=R){ll mid=(L+R)/2;if(che(mid)){ans=mid;R=mid-1;}else L=mid+1;}printf("%lld\n",ans);}return 0;
}}
signed main(){Miracle::main();return 0;
}/*Author: *Miracle*
*/

二分判定突破口

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

大量运用排序+双指针。

转载于:https://www.cnblogs.com/Miracevin/p/10779859.html

[CTSC2017]网络相关推荐

  1. 苹果设备iphone,ipad,macbook网络连接慢,开机开什么卡什么,一步解决

    苹果电脑网络连接慢,开机开什么卡什么??? 网络上的方法一种种,没有一个适用的? 如果你的macbook也是打开就没网,但有一些软件也能用,就是浏览器加载跑条儿,不妨试试! 系统偏好设置-网络-高级- ...

  2. 大数据学习01——配置虚拟机节点相关网络

    1.配置mac地址和ip (1)更改适配器设置 找到这个后开始设置windows中的网络连接 (2)接着对三台虚拟机的mac地址和ip进行设置 1.mac地址设置 进入linux节点中的这个位置进行设 ...

  3. 【Docker】容器的几种网络模式

    当你使用Docker时,你会发现需要了解很多关于网络的知识.Docker作为目前最火的轻量级容器引擎,因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求.本文介绍了Docker的4种 ...

  4. 2022-2028年中国网络直播行业深度调研及投资前景预测报告

    [报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了网络直播行业相关概述.中国网络直播行业运行环境.分析了中国网络直播行 ...

  5. Redis 笔记(15)— 管道 pipeline(客户端将批量命令打包发送用来节省网络开销)

    Redis 是一种基于客户端-服务端模型以及请求/响应协议的 TCP 服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听 Socket 返回,通常是以阻塞模式,等 ...

  6. ubuntu 修改时区、时间、同步网络时间、将时间写入硬件

    查看系统当前的时间状态 $ timedatectl statusLocal time: 六 2021-10-30 09:33:37 CSTUniversal time: 六 2021-10-30 01 ...

  7. python 网络编程之Socket通信案例消息发送与接收

    背景 网络编程是python编程中的一项基本技术.本文将实现一个简单的Socket通信案例消息发送与接收 正文 在python中的socket编程的大致流程图如上所示 我们来首先编写客户端的代码: # ...

  8. win10安装虚拟机提示主IP地址显示网络信息不可用

    问题:在虚拟机详情下面显示 主ip地址:网络信息不可用 解决方案 先root用户[root@localhost~]#cd - [root@localhost/]#cd /etc/sysconfig/n ...

  9. 虚拟机网络连接方式linuxcentos

    20210910 https://www.cnblogs.com/luxiaodai/p/9947343.html NAT 方式配置固定ipvmnet8 这块网卡的ip地址和虚拟机的ip地址要不一样 ...

最新文章

  1. 陷阱太多!究竟该如何应对逆袭神器期权?某程序员历经4次上市公司,终于顿悟!...
  2. 开关电源过流保护-打嗝模式
  3. php curl异步跳转,php curl批处理--可控并发异步
  4. 阿里云马劲:保证云产品持续拥有稳定性的实践和思考\n
  5. 安装Terminator和快捷键使用
  6. python实现深度优先搜索_python中的深度优先搜索算法
  7. SpringBoot2.x 整合websocket 消息推送,单独发送信息,群发信息
  8. spo机试题JAVA_基于龙芯处理器的Java运行环境的移植与优化
  9. 新塘linux启动过程,NUC972调试笔记之NAND分区调整新增
  10. 中职学校实验室安全整改总结报告
  11. springboot+quartz定时任务
  12. 软考软件设计师中级考试(二)——操作系统基本原理
  13. 数字图像处理Project1——指纹图片的增强
  14. 《蜥蜴脑法则》读后感
  15. 微信小程序中实现地图导航
  16. 遥感影像基于样本的面向对象分类方法
  17. MYSQL登录遇到的问题:解决ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:3306‘(10061)
  18. 台灯显色指数多少合适?专家教你护眼灯怎么选
  19. CEF3:用CEF3实现最简单的浏览器
  20. 学波尔还是学王励勤?-----再谈正手弧圈的重心转移

热门文章

  1. devstack mysql_devstack安装使用openstack常见问题与解决办法_MySQL
  2. DevOps基础-1.1-什么是DevOps以及概述
  3. html中相对定位怎么写,css中的怎么设置相对定位?
  4. 各种颜色代码大全(Html、android)
  5. Emacs是神的编辑器,而Vim是编辑器之神
  6. laravel中predis的应用
  7. 细数云课堂为那些用户带来的便捷体验
  8. TI AM5728 SDK升级之 linux设备树解析,以网口cpsw为例
  9. 随机森林算法(Random Forest)Python实现
  10. 互联网中一些常用指标(PV、UV、蹦失率、转换率、退出率)