题解——洛谷 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 国的首都爆发了一种危害性极高的传染病.当局为了控 ...
随机推荐
- laravel中使用的PDF扩展包——laravel-dompdf和laravel-snappy
这两天项目中需要将HTML页面转换为PDF文件方便打印,我在网上搜了很多资料.先后尝试了laravel-dompdf和laravel-snappy两种扩展包,个人感觉laravel-snappy比较好 ...
- linux环境下tab键自动缩进4个空格
1. 进入 root 模式 su root 2. 编辑 /etc/vimrc 文件 root@localhost /home/xiluhua/tscripts $ vi /etc/vimrc 3. 文 ...
- python locust 性能测试:locust安装和一些参数介绍
安装参考 https://www.cnblogs.com/fnng/p/6081798.html <虫师大大的,很详细> ps:python3.7暂不支持locust:python3安装建 ...
- tensorflow--variable_scope
1.with tf.variable_scope(name , reuse = reuse) (1)创建variable scope with tf.variable_scope("foo& ...
- C# CheckBox与RadioButton
通常RadioBox称为单选按钮,CheckBox称为多选按钮,这两个控件都是从ButtonBase类中派生,可以将其视为按钮. 多个checkBox之间的选择是互相独立的,互补影响.多个RadioB ...
- 利用PHP将图片转换成base64编码的实现方法
先来说一下为什么我们要对图片base64编码 base64是当前网络上最为常见的传输8Bit字节代码的编码方式其中之一.base64主要不是加密,它主要的用途是把某些二进制数转成普通字符用于网络传输. ...
- tft屏图像显示也成功完成
2010-04-30 14:18:00 tft屏图像显示也成功完成. 其实有了刷屏的经验,图像显示就很简单. void address_set(uint x1,uint y1,uint x2,uint ...
- jquery easyui datagrid 空白条处理 自适应宽高 格式化函数formmater 初始化时会报错 cannot read property 'width'||'length' of null|undefined
1---表格定义好之后右侧可能会有一个空白条 这个空白条是留给滚动条的,当表格中的一页的数据在页面中不能全显示时会自动出现滚动条,网上有很多事要改源码才可以修改这个,但是当项目中多处用到时,有的需要滚 ...
- ubuntu_python_environment
参考:http://blog.csdn.net/kingppy/article/details/13080919 参考:http://blog.csdn.net/zhaobig/article/det ...
- Spring Boot 实现RESTful webservice服务端示例
1.Spring Boot configurations application.yml spring: profiles: active: dev mvc: favicon: enabled: fa ...