题解——洛谷 P2680 NOIP提高组 2015 运输计划
树上差分加上二分答案
详细题解待填坑
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXlog = ;
const int MAXM = ;
const int MAXN = ;
int dep[MAXN],jump[MAXN][MAXlog+];
int lcav[MAXM],cf[MAXN],fw[MAXN],lent[MAXN];
int uline[MAXM],vline[MAXM],wline[MAXM];
int cnt=,u[MAXN*],v[MAXN*],w[MAXN*],first[MAXN*],next[MAXN*];
int n,m;
void addline(int ux,int vx,int i){
uline[i]=ux;
vline[i]=vx;
wline[i]=lent[ux]+lent[vx]-*lent[lcav[i]];
}
void addedge(int ux,int vx,int wx){
cnt++;
u[cnt]=ux;
v[cnt]=vx;
w[cnt]=wx;
next[cnt]=first[ux];
first[ux]=cnt;
}
void dfs(int u,int f){
// printf("u=%d f=%d\n",u,f);
dep[u]=dep[f]+;
jump[u][]=f;
// printf("u=%d j=0 jump=%d\n",u,jump[u][0]);
for(int i=;i<=MAXlog;i++){
jump[u][i]=jump[jump[u][i-]][i-];
// printf("u=%d j=%d jump=%d\n",u,i,jump[u][i]);
}
for(int i=first[u];i;i=next[i])
if(v[i]!=f)
dfs(v[i],u);
}
void dfs2(int u,int f,int wk){
fw[u]=wk;
lent[u]=lent[f]+wk;
for(int i=first[u];i;i=next[i])
if(v[i]!=f)
dfs2(v[i],u,w[i]);
}
int lca(int x,int y){
if(dep[y]>dep[x])
swap(x,y);
for(int i=MAXlog;i>=;i--)
if(dep[x]-(<<i)>=dep[y])
x=jump[x][i];
if(x==y)
return x;
for(int i=MAXlog;i>=;i--)
if(jump[x][i]!=jump[y][i]){
x=jump[x][i];
y=jump[y][i];
}
return jump[x][];
}
void runcf(int l){
cf[uline[l]]++;
cf[vline[l]]++;
cf[lcav[l]]-=;
}
int maxlen=;
void calcf(int u,int f,int num){
for(int i=first[u];i;i=next[i]){
if(v[i]==f)
continue;
calcf(v[i],u,num);
cf[u]+=cf[v[i]];
}
if(cf[u]==num&&fw[u]>maxlen)
maxlen=fw[u];
}
bool check(int ans){
int inq=;
int maxchain=;
maxlen=;
// printf("!ok\n");
memset(cf,,sizeof(cf));
for(int i=;i<=cnt;i++)
if(wline[i]>ans){
runcf(i);
inq++;
if(wline[i]>maxchain)
maxchain=wline[i];
} calcf(,,inq);
// printf("*ok\n");
if(maxchain-maxlen<=ans)
return true;
else
return false;
}
int main(){
scanf("%d %d",&n,&m);
int maxt=;
for(int i=;i<=n-;i++){
int a,b,t;
scanf("%d %d %d",&a,&b,&t);
addedge(a,b,t);
addedge(b,a,t);
maxt=max(maxt,t);
}
dep[]=-;
dfs(,);
dfs2(,,);
int maxline=;
for(int i=;i<=m;i++){
int um,vm;
scanf("%d %d",&um,&vm);
// if(jump[5][0]!=3)
// printf("!\n");
lcav[i]=lca(um,vm);
addline(um,vm,i);
if(wline[i]>maxline)
maxline=wline[i];
}
/*for(int i=0;i<=n;i++){
for(int j=0;j<=MAXlog;j++)
printf("jump[%d][%d]=%d \n",i,j,jump[i][j]);
printf("\n");
}*/
/*for(int i=1;i<=m;i++){
printf("u=%d v=%d lca=%d len=%d\n",uline[i],vline[i],lcav[i],wline[i]);
}*/
int l=maxline-maxt,r=maxline+;
while(l<r){
int mid=(l+r)>>;
if(check(mid))
r=mid;
else
l=mid+;
}
printf("%d",r);
return ;
}
题解——洛谷 P2680 NOIP提高组 2015 运输计划的更多相关文章
- 题解 【luogu P2680 NOIp提高组2015 运输计划】
题目链接 题解 题意 一棵树上有\(m\)条路径,可以将其中一条边的权值改为0,问最长的路径最短是多少 分析 最短的路径最长自然想到二分最长路径,设其为\(dis\) 关键在于如何check chec ...
- 题解——洛谷P2827 NOIP提高组 2016 蚯蚓
队列模拟 详细题解待填坑 #include <cstdio> #include <algorithm> #include <queue> #include < ...
- 洛谷P1006 NOIP提高组2008 传纸条
P1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n 列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无 ...
- 洛谷 P2680 [NOIP2015 提高组] 运输计划
链接:P2680 题意: 在树上把一条边边权变为0使得最长给定路径最短 分析: 最大值最小可以想到二分答案,对于每一个mid,寻找所有大于mid的路径,再寻找是否存在一条边使得删去它后大于mid的路径 ...
- 【洛谷】NOIP提高组模拟赛Day1【组合数学】【贪心+背包】【网络流判断是否满流以及流量方案】
U41568 Agent1 题目背景 2018年11月17日,中国香港将会迎来一场XM大战,是世界各地的ENLIGHTENED与RESISTANCE开战的地点,某地 的ENLIGHTENED总部也想派 ...
- ⌈洛谷1312⌋⌈NOIP提高组2011⌋Mayan游戏【搜索】
感想 真的,感觉这道题目好坑爹,我这个蒟蒻调了好几个世纪才调出来. 重构代码千万遍,依旧只有-1输出. 正解 非常明显的一道搜索题目. 每一次记录上一级的状态,这样实现比较不容易出错. 然后考虑剪枝: ...
- 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】
U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...
- 【NOIP】提高组2015 运输计划
[题意]n个点的树,m条链,求将一条边的权值置为0使得最大链长最小. [算法]二分+树上差分 [题解] 最大值最小化问题,先考虑二分最大链长. 对所有链长>mid的链整体+1(树上差分). 然后 ...
- 洛谷P1084 [NOIP2012提高组Day2T3]疫情控制
P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...
随机推荐
- hdu3511 圆的扫描线
http://blog.csdn.net/firenet1/article/details/47041145 #include <iostream> #include <algori ...
- 开源词袋模型DBow3原理&源码(一)整体结构
前人摘树,后人乘凉. 源码在github有CMakeLists,代码下下来可以直接编译. 泡泡机器人有个很详细的分析,结合浅谈回环检测中的词袋模型,配合高翔的回环检测应用,基本上就可以串起来了. tf ...
- First Wainberg-2018-Deep learning in biomedicine Experience
ppt+paper 链接:https://pan.baidu.com/s/14toqjcSJti5ZXT3ff4rwIA 提取码:xgkt
- 从网站上扒网页,保存为file文件格式
保存下来的页面总是有部分特效缺失,可是文件包里已经有好几个js文件了. 例如想保存易迅的搜索页面,条件筛选栏的按钮全部失效了,按钮-更多.多选等 都没有反应,搜索结果的鼠标悬浮显示完整信息也没有了. ...
- 在hue中使用hive
一.创建新表 建表语句如下: CREATE TABLE IF NOT EXISTS user_collection_9( user_id string , seller_id string , pro ...
- flask 自定义验证器(行内验证器、全局验证器)
自定义验证器 在WTForms中,验证器是指在定义字段时传入validators参数列表的可调用对象,下面来看下编写自定义验证器. 行内验证器 除了使用WTForms提供的验证器来验证表单字段,我们还 ...
- javamail发送邮件及错误解决方法javax.mail.AuthenticationFailedException: failed to connect, no password specified?
javamail发送邮件及错误解决方法javax.mail.AuthenticationFailedException: failed to connect, no password specifie ...
- mac电脑设置USB键盘按键方法,设置多显示屏镜像显示器的方法
mac电脑设置USB键盘按键方法,设置多显示屏镜像显示器的方法 设置多显示屏镜像显示器的方法 ==================== mac电脑复制粘贴使用command+c command+v - ...
- 迭代器 生成器 yield
iter 迭代iterable 可迭代的 iterator迭代器 dir函数查看一个数据类型内部含有哪些方法 两边带着双下划线的方法叫做"魔术方法","双下方法" ...
- 安装指定版本capistrano
1.ruby安装 #yum install -y openssl-devel readline-devel zlib-devel git #git clone https://github.com/s ...