BZOJ 4901 [CTSC2017]网络
题解:
只会O(n log^2 n)
O(n log n)先留坑
不开long long 0 分!!!!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
const long long oo=1000000000000000LL; int n;
long long c; int nn;
long long k1[maxn];
int pla[maxn];
long long len[maxn]; long long l,r,mid,ans; int cntedge=;
int head[maxn]={};
int to[maxn<<],nex[maxn<<],dist[maxn<<];
void Addedge(int x,int y,int z){
nex[++cntedge]=head[x];
to[cntedge]=y;
dist[cntedge]=z;
head[x]=cntedge;
} int vis[maxn];
int p[maxn],cntn;
int lp,rp;
int father[maxn];
long long d[maxn];
long long tmpd[maxn]; void Dfs0(int now,int fa){
father[now]=fa;
for(int i=head[now];i;i=nex[i]){
if(to[i]==fa)continue;
d[to[i]]=d[now]+dist[i];
Dfs0(to[i],now);
}
}
void GetD(int x){
vis[x]=;
if(father[x])GetD(father[x]);
p[++cntn]=x;
}
long long Getdist(int x,int fa){
long long ret=;
for(int i=head[x];i;i=nex[i]){
if(to[i]==fa)continue;
if(vis[to[i]])continue;
ret=max(ret,dist[i]+Getdist(to[i],x));
}
return ret;
} struct FenwickTree{
long long c[maxn];
void Addp(int x,long long val){
while(x<=nn){
c[x]=max(c[x],val);
x+=(x&(-x));
}
}
long long Querymax(int x){
long long ret=-oo;
while(x){
ret=max(ret,c[x]);
x-=(x&(-x));
}
return ret;
}
void Clea(){
for(int i=;i<=nn;++i)c[i]=-oo;
}
}T[]; int Isok(){
long long lim1=-oo,lim2=-oo,lim3=-oo,lim4=-oo; T[].Clea();T[].Clea();
for(int i=;i<=cntn;++i){
int p=lower_bound(k1+,k1++nn,d[i]+len[i]-mid)-k1;
long long mxsum=T[].Querymax(p-);
long long mxdelt=T[].Querymax(p-);
lim1=max(lim1,d[i]+len[i]+mxsum+c-mid);
lim2=max(lim2,-d[i]+len[i]+mxsum+c-mid);
lim3=max(lim3,d[i]+len[i]+mxdelt+c-mid);
lim4=max(lim4,-d[i]+len[i]+mxdelt+c-mid);
T[].Addp(pla[i],d[i]+len[i]);
T[].Addp(pla[i],-d[i]+len[i]);
} int p1=,p2=;
int fla=;
for(int i=;i<=cntn;++i){
long long tl=max(lim1-d[i],lim2+d[i]);
long long tr=min(-lim3+d[i],-lim4-d[i]);
if(tl>tr)continue;
while((d[p1]<tl)&&(p1<=cntn))++p1;
while((d[p1-]>=tl)&&(p1>))--p1;
while((d[p2+]<=tr)&&(p2<cntn))++p2;
while((d[p2]>tr)&&(p2>=))--p2;
if(p1<=p2){
fla=;break;
}
}
return fla;
} void Minit(){
cntn=lp=rp=cntedge=nn=;
l=;r=oo;ans=oo;
memset(len,,sizeof(len));
memset(head,,sizeof(head));
memset(vis,,sizeof(vis));
memset(p,,sizeof(p));
memset(father,,sizeof(father));
memset(d,,sizeof(d));
} int main(){
scanf("%d%lld",&n,&c);
while(n!=){
Minit();
for(int i=;i<=n-;++i){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
Addedge(x,y,z);
Addedge(y,x,z);
}
d[]=;
Dfs0(,);
for(int i=;i<=n;++i){
if(d[i]>d[lp])lp=i;
}
d[lp]=;
Dfs0(lp,);
for(int i=;i<=n;++i){
if(d[i]>d[rp])rp=i;
} for(int i=;i<=n;++i)tmpd[i]=d[i];
GetD(rp);
for(int i=;i<=cntn;++i)len[i]=Getdist(p[i],);
for(int i=;i<=cntn;++i)l=max(l,len[i]);
for(int i=;i<=cntn;++i)d[i]=tmpd[p[i]]; for(int i=;i<=cntn;++i)k1[i]=d[i]-len[i];
sort(k1+,k1++cntn);
nn=unique(k1+,k1++cntn)-k1-;
for(int i=;i<=cntn;++i)pla[i]=lower_bound(k1+,k1++nn,d[i]-len[i])-k1; r=l*+d[cntn];
while(l<=r){
mid=(l+r)>>;
if(Isok()){
ans=mid;r=mid-;
}else{
l=mid+;
}
}
cout<<ans<<endl; scanf("%d%lld",&n,&c);
}
return ;
}
BZOJ 4901 [CTSC2017]网络的更多相关文章
- [CTSC2017]网络
[CTSC2017]网络 连一条长度为len的边,使得基环树的直径最小 结论:一定连在某条直径两个点上(否则更靠近不劣) 然后二分答案判定. dp[i]:链上一个点往下延伸的最大深度 考虑对于任意两个 ...
- BZOJ 3931: [CQOI2015]网络吞吐量
3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1555 Solved: 637[Submit][Stat ...
- bzoj 3931 [CQOI2015]网络吞吐量(最短路,最大流)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3931 [题意] 只能通过1-n的最短路,求网络最大流 [思路] 分别以1,n为起点做最 ...
- BZOJ 3931: [CQOI2015]网络吞吐量 最大流
3931: [CQOI2015]网络吞吐量 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )
最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ...
- BZOJ 4538: [Hnoi2016]网络 [整体二分]
4538: [Hnoi2016]网络 题意:一棵树,支持添加一条u到v权值为k的路径,删除之前的一条路径,询问不经过点x的路径的最大权值 考虑二分 整体二分最大权值,如果\(k \in [mid+1, ...
- ●BZOJ 3931 [CQOI2015]网络吞吐量
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3931 题解: 在最短路图上跑网络流,要开long long(无奈 BZOJ AC 不了,洛谷 ...
- BZOJ.2816.[ZJOI2012]网络(LCT)
题目链接 BZOJ 洛谷 对每种颜色维护一个LCT,保存点之间的连接关系. 修改权值A[x]和所有Max[x]都要改: 修改边的颜色先枚举所有颜色,看是否在某种颜色中有边,然后断开.(枚举一遍就行啊 ...
- bzoj 3931: [CQOI2015]网络吞吐量 -- 最短路+网络流
3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec Memory Limit: 512 MB Description 路由是指通过计算机网络把信息从源地址传输到目的地址 ...
随机推荐
- BSD socket编程学习
1.socket简介 BSD是实现TCP/IP协议通信的软件系统,socket是应用编程接口,为app提供使用TCP/IP协议通信的接口. 网络层IP提供点到点服务(IP地址标识),传输层TCP和UD ...
- 计算机网络中OSI参考模型
OSI参考模型 应用层 包括所有能产生网络流量的程序 DNS属于这一层 表示层 用来判断传输之前是否进行加密或压缩处理(二进制.ASCII) 比如出现乱码情况,可能就是表示层的问题 会话层 一个浏览器 ...
- python2.7 操作ceph-cluster S3对象接口 实现: 上传 下载 查询 删除 顺便使用Docker装个owncloud 实现UI管理
python version: python2.7 需要安装得轮子: botofilechunkio command: yum install python-pip&& pip ...
- ffmpeg 学习: 003-关键函数介绍
背景 了解一些关键函数对于开发的帮助比较大. avformat_open_input FFMPEG 打开媒体的过程开始于 avformat_open_input,因此该函数的重要性不可忽视. 在该函数 ...
- ModelSim安装步骤
刚成功安装了软件的我反手就是一篇安装步骤分享. 这是我自己创建的永久百度云链接. ModelSim10.7软件下载百度云链接 网址:https://pan.baidu.com/s/14oGZytocA ...
- windows制作动态链接库和使用二
动态库的另一种制作方法: 不使用_declspec(dllexport)关键字,使用.def文件 //exportFun.def 文件名随意 EXPORT add @ //格式 函数名 @编号 < ...
- systemctl常规应用
以samba为例——常用项 #systemctl start smb ——在smb服务没有启动的情况下启动这项服务. #systemctl restart smb ——在修该过相应的配 ...
- css的艺术
鲁先生曾经说过:"html和css都不能算一门语言..." html确实不能算一门语言,他只是二三十个英语单词而已,但是css不一样,css是==艺术== 骚操作 上图的12个图标 ...
- 017、Java中使用float型
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- redis学习(五)
一.Redis 发布订阅 1.Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 2.Redis 客户端可以订阅任意数量的频道. 比如你订阅 ...