loj2425 「NOIP2015」运输计划[二分答案+树上差分]
看到题意最小化最长路径,显然二分答案,枚举链长度不超过$\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」运输计划[二分答案+树上差分]的更多相关文章
- [luogu]P2680 运输计划[二分答案][树上差分]
[luogu]P2680 [NOIP2015]运输计划 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n ...
- luogu P2680 运输计划 (二分答案+树上差分)
题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间 ...
- 「NOIP2015」运输计划
传送门 Luogu 解题思路 首先这题可以直接二分答案,然后我们每次都把属于长度大于二分值的路径上的边标记一次,表示选这条边可以优化几条路径. 然后我们显然是要选一条覆盖次数等于需要覆盖的路径数并且长 ...
- BZOJ 4326: NOIP2015 运输计划(二分,树上差分)
Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1945 Solved: 1243[Submit][Status][Discuss] Descript ...
- P2680 运输计划[二分+LCA+树上差分]
题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间,这 n-1n−1 条航道连通了 LL 国的所有星球. 小 ...
- 【bzoj4326】[NOIP2015]运输计划 二分答案+LCA
题目描述 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球.小 P 掌管一家物流公司, 该 ...
- luogu2680 [NOIp2015]运输计划 (tarjanLca+二分答案+树上差分)
我们先不会就二分一下答案,设它是x,我们要判断它能不能满足 为了满足这个答案,我们就要让原本路径长度大于x的所有路径都经过某条边,而且这条边还要大于等于最长的路径-x 于是运用树上差分的思想,对于所有 ...
- BZOJ 4326 NOIP2015 运输计划(二分答案 + 树上差分思想)
题目链接 BZOJ4326 这个程序在洛谷上TLE了……惨遭卡常 在NOIP赛场上估计只能拿到95分吧= = 把边权转化成点权 首先求出每一条路径的长度 考虑二分答案,$check(now)$ 对于 ...
- 洛谷P2680 运输计划 [LCA,树上差分,二分答案]
题目传送门 运输计划 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n?1 条双向航道,每条航道建立在两个星球之间, 这 n?1 条航道连通了 L 国的所 ...
随机推荐
- Maven跳过单元测试的两种方式
-DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下. -Dmaven.test.skip=true,不执行测试用例,也不编译测试 ...
- git 命令 git diff 查看 Git 区域文件的具体改动
查看 Git 区域文件的具体改动 git diff git status 只能让我们知道文件在 Git 区域内的改动状态,但如果我们想查看某个文件内具体改了什么(也可以理解为在不同 Git 区域中的差 ...
- visio给任意图形进行填充
使用visio给图形填充颜色的条件:图形必须是封闭的!!! 但是很多人不明白:我明明画的图形是封闭的啊!可是无法填充颜色!这是因为,你画了一个看上去是封闭的图形,但是VISIO认为你画的不是封闭图形! ...
- [bzoj3887][Usaco2015 Jan]Grass Cownoisseur_trajan_拓扑排序_拓扑序dp
[Usaco2015 Jan]Grass Cownoisseur 题目大意:给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在 ...
- PTA(Advanced Level)1083.List Grades
Given a list of N student records with name, ID and grade. You are supposed to sort the records with ...
- 【转帖】知乎关于鸿蒙OS的思考
作者:bacon xu链接:https://www.zhihu.com/question/339567108/answer/782431141来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非 ...
- Redis(1.5)Redis配置文件(4.0.14)
4.0.14 常用配置 bind 127.0.0.1 # 默认绑定本地,不写的话任何地址都可以访问 protected-mode yes #保护模式,如果没有设置bind 配置地址,也没有设置任何密码 ...
- IE浏览器的脚本文本框监听事件
一.IE8的文本框监听事件 由于在IE8所以input和propertychange都不能用,终于皇天不负有心人让我找到了这个:https://github.com/sophiebits/jquery ...
- php 取post数据的三种方式
$_POST.$GLOBALS['HTTP_RAW_POST_DATA'].file_get_contents("php://input") 都有用来取post数据,用下来感觉大致 ...
- Lua格式讲解
firstValue = "This is a string value"; -- 这是一个变量的定义,变量定义不需要任何标记,这个是全局变量 print("helloW ...