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 路由是指通过计算机网络把信息从源地址传输到目的地址 ...
随机推荐
- Day3-R-Aggressive cows POJ2456
Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are locat ...
- NO16 第二关课后考试-aw-F-过滤已知的一级目录
·总结的经验:1.学会总结时学好运维的重要前提.2.通过案列或例子来总结一个技术点或者命令.3.画一张逻辑图,形象的卡通记忆这个知识技术点.4.通过管道过滤数据时,最好先输出结果,然后回退再使用管道看 ...
- POJ1471 Tree/洛谷P4178 Tree
Tree P4178 Tree 点分治板子. 点分治就是直接找树的重心进行暴力计算,每次树的深度不会超过子树深度的\(\frac{1}{2}\),计算完就消除影响,找下一个重心. 所以伪代码: voi ...
- 浅谈MSF渗透测试
在渗透过程中,MSF漏洞利用神器是不可或缺的.更何况它是一个免费的.可下载的框架,通过它可以很容易地获取.开发并对计算机软件漏洞实施攻击.它本身附带数百个已知软件漏洞的专业级漏洞攻击工具.是信息收集. ...
- 清北学堂例题 LUOGU2523【HAOI2011】problem c
题目描述 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了,就尝试ai+1 ...
- solus linux 中文输入法
默认用ibus输入框架,安装ibus-libpinyin sudo eopkg install ibus-libpinyin ibus 安装好后重启 在系统设置 -区域和语言中添加中文,(记得自己设置 ...
- mysql批量插入更新操作
//添加关联赠品(确定) public function addGiveGoods($ids,$child,$parent_sku_no){ $license=new LicenseModel(); ...
- HashMap之Hash碰撞源码解析
转自:https://blog.csdn.net/luo_da/article/details/77507315 https://www.cnblogs.com/tongxuping/p/827619 ...
- Ubuntu 14.04 配置 VNC Server
用putty连接Linux后,如果会话断开,也会终止此会话在Linux执行的任务. 用WinSCP传输文件很方便,目前也只能传输文件. 按照以下步骤以及提示,安装VNC Server, 1.apt-g ...
- 小程序开发顶部TAB栏和侧边分类点击
先上一个效果图: 根据这个效果图我来说内容. 首先是顶部tab栏 效果实现依靠的是一个组件scroll-view.这个组件很有意思,可以多层嵌套,当然它的属性也很多. 这里主要用的是scroll-x, ...