[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 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...
随机推荐
- 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)
观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...
- SAP MM 明明已经扩展供应商到采购组织下,采购订单里还是报错?
SAP MM 明明已经扩展供应商到采购组织下,采购订单里还是报错? 如下的PO 4400000069,处于HELD状态.ME22N试图保存它为一个正式的采购订单,报错说供应商没有在采购组织下维护, 使 ...
- Git - git status - 查看当前仓库状态
索引: 目录索引 参看代码 GitHub: git.txt 一.示例: git status 二.说明: 1."status" 部分 该命令可以查出当前分支文件变更状态, 可以查出 ...
- 自托管websocket和webapi部署云服务器域名及远程访问
当写完websocket和webapi服务端时,在本地测试时是没有问题的,因为是通过本地IP及端口号访问(例:127.0.0.1:8080\api\test),也就没有防火墙等安全限制,但当部署到云服 ...
- linux安装windows启动盘
安装gparted
- 对css盒模型的理解
介绍一下标准css的盒子模型?低版本IE的盒子模型有什么不同的? 1.有两种:IE盒子模型(怪异模式).W3c盒子模型(标准模式). 2.盒模型组成:内容(content).内边距(padding). ...
- SQL SERVER 2012 AlwaysOn - 操作系统层面 01
搭建 AlwaysOn 是件非常繁琐的工作,需要从两方面考虑,操作系统层面和数据库层面,AlwaysOn 非常依赖于操作系统,域控,群集,节点等概念: DBA 不但要熟悉数据库也要熟悉操作系统的一些概 ...
- java倒计时三种简单实现方式
写完js倒计时,突然想用java实现倒计时,写了三种实现方式 一:设置时长的倒计时: 二:设置时间戳的倒计时: 三:使用java.util.Timer类实现的时间戳倒计时 代码如下: package ...
- CMake与Make最简单直接的区别 [转]
写程序大体步骤为: 1.用编辑器编写源代码,如.c文件. 2.用编译器编译代码生成目标文件,如.o. 3.用链接器连接目标代码生成可执行文件,如.exe. 但如果源文件太多,一个一个编译时就会特别麻烦 ...
- Vue中循环的反人类设计
今天学习Vue到循环那里,表示真是不能理解Vue的反人类设计 具体看代码吧! <!DOCTYPE html> <html> <head> <meta char ...