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 路由是指通过计算机网络把信息从源地址传输到目的地址 ...
随机推荐
- ADS 2015破解方法--笔记
关键步骤是:设定系统环境变量HPEESOF_LIC_DIR,然后重启,再打开License Manager进行License的添加
- git 的一些基本命令
基本命令 1.返回上一级目录:cd ../ 2.进入某一目录:cd git (进入 git 目录) 3. 显示当前路径:pwd 4.显示当前文件目录的文件 : dir 5.新建文件夹:mkdir +文 ...
- 题解 loj3050 「十二省联考 2019」骗分过样例
CASE \(1\sim 3\) \(n\)组测试数据,每次输入一个数\(x\),求\(19^x\). 测试点\(1\),\(x=0,1,\dots n-1\),可以直接递推. 测试点\(2\)要开l ...
- $('#myModal').modal('show') //显示$('#myModal').modal('hide')隐藏
你这样试试,这是官方文档的写法 $('#myModal').modal('show') //显示$('#myModal').modal('hide')隐藏 //重复点击的隐藏显示有一个很更方便的写法$ ...
- chromedriver版本问题
最新的chromedriver 66.0.3359.117 的对应chromedriver版本为2.38 http://npm.taobao.org/mirrors/chromedriver/ Web ...
- python 输入年月日,返回当天是星期几
引入内置模块calendar,输入年.月.日,根据weekday(year,month,day)的返回值,输出该日期是星期几.函数weekday()返回0-6分别对应星期一至星期日 import ca ...
- Java笔记--常用类
1.String类: --使用Unicode字符编码,一个字符占两个字节: --String类是一个final类,代表不可变的字符序列: --字符串是不可变的,一个字符串对象一旦被配置,其内容是不可变 ...
- 剑指offer 数组中重复的数
在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{ ...
- IIS7/8 HTTP Error 500.19 错误 0x80070021 错误代码:0x8007000d
nopCommerce versions 4.20 的安装环境是 dotnet-hosting-2.2.0-win.exe .net core项目iis10上出现 HTTP 错误 500.19,错误代 ...
- DIV 透明度 设置
filter:alpha(opacity=70); -moz-opacity:0.70;-khtml-opacity: 0.70; opacity: 0.70;