This article is made by Jason-Cow.
Welcome to reprint.
But please post the writer's address.

http://www.cnblogs.com/JasonCow/

[NOIP2015]运输计划    Hello!链剖。你好吗?

题意:

给出一棵n个节点的带权树,m对树上点对

现在允许删除一条边,(权值修改为0)

输出: 最小化的点对间最大距离

1.链剖

2.树上差分

3.二分

链剖我就不多说了,就是两dfs

注意:要在dfs1中多维护一个dis[x],x到root的距离,顺便记录一下w[x]!

 void dfs1(int u,int f){
fa[u]=f,dep[u]=dep[f]+,siz[u]=;
for(int i=head[u];i;i=E[i].next){
int v=E[i].v;
if(v!=f){
w[v]=E[i].w,dis[v]=dis[u]+E[i].w;
dfs1(v,u);
siz[u]+=siz[v];
if(!son[u]||siz[v]>siz[son[u]])son[u]=v;
}
}
}

dfs1

 void dfs2(int u,int t){
dfn[u]=++idx,top[u]=t;
if(son[u])dfs2(son[u],t);
for(int i=head[u];i;i=E[i].next){
int v=E[i].v;
if(v!=fa[u]&&v!=son[u])dfs2(v,v);
}
}

dfs2

树上差分,先差分,后dfs上放(95分的根本原因,不过好写)

细节:add(l,r)  <=>  cf[l]++ , cf[r+1]--; 再上放

 void modify(int u,int f){
for(int i=head[u];i;i=E[i].next){
int v=E[i].v;
if(v!=f){
modify(v,u);
cf[u]+=cf[v];
}
}
}

modify

二分,很显然好吗。

 bool check(int x){
int cnt=,maxcost=;
memset(cf,,sizeof(cf));
for(int i=;i<=m;i++)
if(a[i].dis>x){
cnt++;
maxcost=max(maxcost,a[i].dis-x);
cf[a[i].s]++,cf[a[i].t]++;cf[a[i].lca]-=;
}
if(cnt==)return false;
modify(,);
for(int i=;i<=n;i++)
if(cf[i]==cnt && w[i]>=maxcost)
return false;
return true;
}

check

这个还不是正解,因为被卡常了,于是我就卡数据,嘿嘿嘿~~

 #include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <map>
#include <set>
using namespace std;
const int N=3e5+,M=6e5+;
inline void _(int &ans){
ans=;char x=getchar(),f=;
while(x<''||x>''){if(x=='-')f=;x=getchar();}
while(x>=''&&x<='')ans=ans*+x-'',x=getchar();
if(f)ans=-ans;
} int head[N],tot,n,m;
int dfn[N],top[N],siz[N],son[N],dep[N],fa[N],idx;
int dis[N],w[N],cf[N];
struct node{int v,w,next;}E[M];
struct ask{int lca,dis,s,t;}a[N];
void add(int u,int v,int w){E[++tot]=(node){v,w,head[u]},head[u]=tot;}
void edge(int u,int v,int w){add(u,v,w),add(v,u,w);} void dfs1(int u,int f){
fa[u]=f,dep[u]=dep[f]+,siz[u]=;
for(int i=head[u];i;i=E[i].next){
int v=E[i].v;
if(v!=f){
w[v]=E[i].w,dis[v]=dis[u]+E[i].w;
dfs1(v,u);
siz[u]+=siz[v];
if(!son[u]||siz[v]>siz[son[u]])son[u]=v;
}
}
} void dfs2(int u,int t){
dfn[u]=++idx,top[u]=t;
if(son[u])dfs2(son[u],t);
for(int i=head[u];i;i=E[i].next){
int v=E[i].v;
if(v!=fa[u]&&v!=son[u])dfs2(v,v);
}
} void lca(int s,int t,int i){
int x=s,y=t;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
a[i].lca=x;
a[i].dis=dis[s]+dis[t]-*dis[x];
} void modify(int u,int f){
for(int i=head[u];i;i=E[i].next){
int v=E[i].v;
if(v!=f){
modify(v,u);
cf[u]+=cf[v];
}
}
} bool check(int x){
int cnt=,maxcost=;
memset(cf,,sizeof(cf));
for(int i=;i<=m;i++)
if(a[i].dis>x){
cnt++;
maxcost=max(maxcost,a[i].dis-x);
cf[a[i].s]++,cf[a[i].t]++;cf[a[i].lca]-=;
}
if(cnt==)return false;
modify(,);
for(int i=;i<=n;i++)
if(cf[i]==cnt && w[i]>=maxcost)
return false;
return true;
} int _u,_v,_w,_s,_t;
int l,r,mid;
int main(){
_(n),_(m);//scanf("%d%d",&n,&m);
for(int i=;i<n;i++){
_(_u),_(_v),_(_w);//scanf("%d%d%d",&_u,&_v,&_w);
edge(_u,_v,_w);
}
dfs1(,);
dfs2(,);
for(int i=;i<=m;i++){
_(_s),_(_t);//scanf("%d%d",&_s,&_t);
a[i].s=_s,a[i].t=_t;
lca(_s,_t,i);
r=max(r,a[i].dis);
}
l=max(,r-);//95分
while(l<=r){
int mid=(l+r)>>;
if(check(mid))l=mid+;
else r=mid-;
}
printf("%d\n",l);
return ;
}

树链剖分-Hello!链剖-[NOIP2015]运输计划-[填坑]的更多相关文章

  1. 数据结构(树链剖分):COGS 2109. [NOIP2015] 运输计划

    2109. [NOIP2015] 运输计划 ★★★   输入文件:transport.in   输出文件:transport.out   简单对比时间限制:1 s   内存限制:256 MB [题目描 ...

  2. [NOIP2015]运输计划 线段树or差分二分

    目录 [NOIP2015]运输计划 链接 思路1 暴力数据结构 思路2 二分树上差分 总的 代码1 代码2 [NOIP2015]运输计划 链接 luogu 好久没写博客了,水一篇波. 思路1 暴力数据 ...

  3. NOIP2015 运输计划(bzoj4326)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 886  Solved: 574[Submit][Status] ...

  4. cogs2109 [NOIP2015] 运输计划

    cogs2109 [NOIP2015] 运输计划 二分答案+树上差分. STO链剖巨佬们我不会(太虚伪了吧 首先二分一个答案,下界为0,上界为max{路径长度}. 然后判断一个答案是否可行,这里用到树 ...

  5. bzoj 4326: NOIP2015 运输计划

    4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MB Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个 ...

  6. [BZOJ4326][codevs4632][codevs5440][UOJ#150][NOIP2015]运输计划

    [BZOJ4326][codevs4632][codevs5440][UOJ#150][NOIP2015]运输计划 试题描述 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n− ...

  7. [NOIP2015]运输计划 D2 T3 LCA+二分答案+差分数组

    [NOIP2015]运输计划 D2 T3 Description 公元2044年,人类进入了宇宙纪元. L国有n个星球,还有n-1条双向航道,每条航道建立在两个星球之间,这n-1条航道连通了L国的所有 ...

  8. AC日记——[NOIP2015]运输计划 cogs 2109

    [NOIP2015] 运输计划 思路: 树剖+二分: 代码: #include <cstdio> #include <cstring> #include <iostrea ...

  9. 题解 [NOIP2015]运输计划

    题解 [NOIP2015]运输计划 题面 解析 首先肯定是要求出每条路径的长度. 这个用节点到根的前缀和就行了(一开始脑抽写了个线段树...) 然后有一个显然的类似贪心的想法, 就是你改造的边肯定在最 ...

随机推荐

  1. vue踩坑:vue+ element ui 表单验证有值但验证失败。

    一.如图:有值但是验证失败 二. <el-form :model="form" :rules="rules"> <el-form-item l ...

  2. (ubuntu系统)安装opencv-python后,报错libSM.so.6: cannot open shared object file: No such file or directory

    这是我在 用云服务器跑python代码时候 遇到的问题  卡在这好长时间...希望对同样遇到这样窘境的小白们有所帮助 在控制台界面下,找不到cv2,,,, 解决办法 步骤一: 输入 sudo pass ...

  3. 粒子群算法优化BP生物能神经网络

    定义: 粒子群中每个粒子的位置表示BP神经网络当前迭代中权值的集合,每个粒子的维数由网络中起连接作用的权值的数量和阈值个数决定,以给定训练样本集的神经网络输出误差作为神经网络训练问题的适应度函数,适应 ...

  4. 八连通(vector动态数组法)

    题目和一般的八连通一样,但行数和列数未定,相乘对于1e6,直接开a[1e6][1e6]的数组肯定会爆内存.用二维的动态vector就能很好的解决这个问题 #include<bits/stdc++ ...

  5. xmind修改默认配置

    XMIND使用过程中,输入英文字符的时候,第1.2层级的英文字母总是默认大写,手动修改很繁琐.默认字体,想切换成其他类型,也是要手动一个个去修改. 网上找了下相关的问题,找到一些解决办法,整理到文档中 ...

  6. C++ socket编程-转载

    转自:https://www.cnblogs.com/L-hq815/archive/2012/07/09/2583043.html 若有违规请联系我删除. 介绍 Socket编程让你沮丧吗?从man ...

  7. Django学习笔记4

    Referto https://docs.djangoproject.com/zh-hans/2.2/intro/tutorial04/ Since we have the abstract conc ...

  8. Jmeter-功能概要

    1.Jmeter工具组成部分 (1)资源生成器:用于生成测试过程中服务器.负载机的资源代码.(LR中的VuGen) (2)用户运行器:通常是一个脚本运行引擎,根据脚本要求模拟指定的用户行为.(LR中的 ...

  9. OpenCV中imread失败cvLoadImage成功

    MYLAF 环境说明 编程环境:Windows 10(64bit), VS2013, OpenCV 2.4.12; 编程语言:C/C++: MYLAF 现象 在代码中,调用imread读取图片失败,但 ...

  10. 17个IoC 软件包和项目

    原文:17个IoC 软件包和项目 1.Autofac GitHub:https://github.com/autofac/Autofac 描述:An addictive .NET IoC contai ...