看到题意最小化最长路径,显然二分答案,枚举链长度不超过$\text{mid}$,然后尝试检验。`````

检验是否存在这样一个边置为0后,全部链长$\le\text{mid}$,其最终目标就是、要让所有$>\text{mid}$的链长通过找出一个为0的公共边减掉而全部变为$\le\text{mid}$的。

那么,统计出这$tot$条超出$\text{mid}$的链的路径上覆盖的边,一条被覆盖了$tot$次的边就可能具备条件,于是贪心找最大的满足条件的边,看是否可以把所有链(也就是最长链)搞成$\le\text{mid}$的,$O(n)$树上差分即可。

于是$O(n\text{log}len)$。

准备去(gu)学(gu)习(gu)的做法:据说当年考场这题log是被卡掉一两个点的?所以有线性做法?待补

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define dbg(x) cerr << #x << " = " << x <<endl
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=3e5+;
struct thxorz{int to,nxt,w;}G[N<<];
struct stothx{int to,nxt,id;}Q[N<<];
struct query{int x,y,lca,dis;}q[N];
int Head[N],tot=,qh[N],qt;
int n,m,L,R,maxdis,maxe;
inline void Addedge(int x,int y,int z){
G[++tot].to=y,G[tot].nxt=Head[x],Head[x]=tot,G[tot].w=z;
G[++tot].to=x,G[tot].nxt=Head[y],Head[y]=tot,G[tot].w=z;
}
inline void AddQuery(int x,int y,int id){
Q[++qt].to=y,Q[qt].nxt=qh[x],qh[x]=qt,Q[qt].id=id;
Q[++qt].to=x,Q[qt].nxt=qh[y],qh[y]=qt,Q[qt].id=id;
}
#define y G[j].to
#define qy Q[j].to
int vis[N],anc[N],dep[N];
int get_anc(int x){return x==anc[x]?x:anc[x]=get_anc(anc[x]);}
void tarjan(int x,int fa){
anc[x]=x;
for(register int j=Head[x];j;j=G[j].nxt)if(y^fa)dep[y]=dep[x]+G[j].w,tarjan(y,x),anc[y]=x;
vis[x]=;
for(register int j=qh[x];j;j=Q[j].nxt)if(vis[qy])
q[Q[j].id].lca=get_anc(qy),q[Q[j].id].dis=dep[x]+dep[qy]-(dep[q[Q[j].id].lca]<<),MAX(R,q[Q[j].id].dis);
}
int d[N],del,cnt;
int dfs(int x,int c){
int ret=d[x];
for(register int j=Head[x];j;j=G[j].nxt)if(y^G[c^].to)ret+=dfs(y,j);
if(ret==cnt)MAX(del,G[c].w);
return ret;
}
#undef y
#undef qy
inline int check(int mid){
memset(d,,sizeof d),del=cnt=;
for(register int i=;i<=m;++i)if(q[i].dis>mid)++d[q[i].x],++d[q[i].y],d[q[i].lca]-=,++cnt;
dfs(,);
return maxdis-del<=mid;
}
int main(){//freopen("test.in","r",stdin);freopen("test.ans","w",stdout);
read(n),read(m);
for(register int i=,x,y,z;i<n;++i)read(x),read(y),read(z),Addedge(x,y,z),MAX(L,z);
for(register int i=;i<=m;++i)read(q[i].x),read(q[i].y),AddQuery(q[i].x,q[i].y,i);
tarjan(,);maxdis=R,maxe=L;L=R-L;//dbg(maxdis),dbg(maxe);
while(L<R){
int mid=L+R>>;
if(check(mid))R=mid;
else L=mid+;
}
printf("%d\n",L);
return ;
}

总结反思:瓶颈在check。关键在于要放眼全部,不要都放在maxdis上;求边若干次覆盖的统计可以往树上差分上想。

loj2425 「NOIP2015」运输计划[二分答案+树上差分]的更多相关文章

  1. [luogu]P2680 运输计划[二分答案][树上差分]

    [luogu]P2680 [NOIP2015]运输计划 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n ...

  2. luogu P2680 运输计划 (二分答案+树上差分)

    题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间 ...

  3. 「NOIP2015」运输计划

    传送门 Luogu 解题思路 首先这题可以直接二分答案,然后我们每次都把属于长度大于二分值的路径上的边标记一次,表示选这条边可以优化几条路径. 然后我们显然是要选一条覆盖次数等于需要覆盖的路径数并且长 ...

  4. BZOJ 4326: NOIP2015 运输计划(二分,树上差分)

    Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1945  Solved: 1243[Submit][Status][Discuss] Descript ...

  5. P2680 运输计划[二分+LCA+树上差分]

    题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间,这 n-1n−1 条航道连通了 LL 国的所有星球. 小 ...

  6. 【bzoj4326】[NOIP2015]运输计划 二分答案+LCA

    题目描述 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球.小 P 掌管一家物流公司, 该 ...

  7. luogu2680 [NOIp2015]运输计划 (tarjanLca+二分答案+树上差分)

    我们先不会就二分一下答案,设它是x,我们要判断它能不能满足 为了满足这个答案,我们就要让原本路径长度大于x的所有路径都经过某条边,而且这条边还要大于等于最长的路径-x 于是运用树上差分的思想,对于所有 ...

  8. BZOJ 4326 NOIP2015 运输计划(二分答案 + 树上差分思想)

    题目链接  BZOJ4326 这个程序在洛谷上TLE了……惨遭卡常 在NOIP赛场上估计只能拿到95分吧= = 把边权转化成点权 首先求出每一条路径的长度 考虑二分答案,$check(now)$ 对于 ...

  9. 洛谷P2680 运输计划 [LCA,树上差分,二分答案]

    题目传送门 运输计划 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n?1 条双向航道,每条航道建立在两个星球之间, 这 n?1 条航道连通了 L 国的所 ...

随机推荐

  1. pandas - parse-date

    1.pd.read_csv()函数中parse_dates()参数 boolean. True -> 解析索引 boolean. If True -> try parsing the in ...

  2. 论文阅读 | HotFlip: White-Box Adversarial Examples for Text Classification

    [code] [pdf] 白盒 beam search 基于梯度 字符级

  3. java 重写的 几大注意点

    Single Dispatch class Parent { void print(String a) { log.info("Parent - String"); } void ...

  4. GridControl gridView显示筛选行,设置条件为包含

    public static void SetFilter(GridView gdv) {     gdv.OptionsView.ShowAutoFilterRow = true; //设置筛选行  ...

  5. FZU2275 Game(kmp

    暑假wa的题了,,,看见vj的attempt痕迹打算挨个补了,简单kmp题,判断bob的串是不是全为0或者是alice的字串就好了 #include<algorithm> #include ...

  6. tp5项目报错no input file specified解决

    关于这个问题众多解决方案 1.php版本问题>5.6,把php版本改成5.5版本 2.入口文件同级目录下的.htaccess文件 RewriteRule ^(.*)$ index.php/$1 ...

  7. C#.net开发 List与DataTable相互转换

    1.DataTable转List集合 /// <summary> /// DataTable转化为List集合 /// </summary> /// <typeparam ...

  8. Bootstrap3基础教程 02 网格布局

    Bootstrap 提供了一套响应式.移动设备优先的流式网格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多列. 网页设计中的网格布局作用:组织内容,让网站易于浏览,并降低用户端 ...

  9. 无障碍开发(六)之ARIA在HTML中的使用规则

    ARIA使用规则一 如果你使用的元素( HTML5 )具有语义化,应该使用这些元素,而不应该重新定义一个添加ARIA的角色.状态或属性的元素. 浏览器的语义化标签已经默认隐含ARIA语义,像nav,a ...

  10. npm安装淘宝镜像cnpm

    在cmd中执行 npm install -g cnpm --registry=https://registry.npm.taobao.org