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. ZOJ1310-Robot (BFS)

    The Robot Moving Institute is using a robot in their local store to transport different items. Of co ...

  2. 使用python 写一个 股票涨跌提醒功能

    1: 安装python: https://www.cnblogs.com/liyafei/articles/11550979.html 将python.exe加入 全局path 2: 安装库:(不需要 ...

  3. PP: Toeplitz Inverse Covariance-Based Clustering of Multivariate Time Series Data

    From: Stanford University; Jure Leskovec, citation 6w+; Problem: subsequence clustering. Challenging ...

  4. php 获取header信息

    nginx服务器获取header信息: 如:获取token: $_SERVER['HTTP_TOKEN']; 获取自定义的参数采用$_SERVER['参数名'] Apache服务器获取header信息 ...

  5. springboot整合websocket实现客户端与服务端通信

    定义  WebSocket是通过单个TCP连接提供全双工(双向通信)通信信道的计算机通信协议.此WebSocket API可在用户的浏览器和服务器之间进行双向通信.用户可以向服务器发送消息并接收事件驱 ...

  6. 2020牛客寒假算法基础集训营2 J.求函数 (线段树 推公式 单点修改 区间查询)

    https://ac.nowcoder.com/acm/contest/3003/J 题解: #include<bits/stdc++.h> typedef long long ll; u ...

  7. Pycharm常用快捷捷捷啊键= =

    超多快捷键的其实,懒得都记住(主要是记不住……) 这里记录一下自己觉得用了确实会很省事的,特别是当你没有鼠标的时候 = = 超常用的 Ctrl + /  注释该行 Ctrl + D  复制该行到下一行 ...

  8. Keep-Alive 以及服务器心跳

    Keep-Alive 来源 :http://www.nowamagic.net/academy/detail/23350305 服务器心跳  来源 :http://www.cnblogs.com/lw ...

  9. 服务器上搭建使用SSH账户登录的Git仓库

    1.安装git yum install -y git 2.创建git仓库保存的目录 mkdir /data/git_repo 3.初始化空仓库 cd /data/git_repogit init -- ...

  10. jqGrid colModel 参数(来自中文手册)

    jqGrid colModel 参数 ColModel 是jqGrid里最重要的一个属性,设置表格列的属性. 属性 数据类型 备注 默认值 align string left, center, rig ...