题解——洛谷 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 国的首都爆发了一种危害性极高的传染病.当局为了控 ...
随机推荐
- 【Hadoop学习之十一】MapReduce案例分析三-PageRank
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 什么是pagerank?算法原理- ...
- Java Socket入门
Java Socket底层采用TCP/IP协议通信,通信细节被封装,我们仅仅需要指定IP.端口,便能轻易地创建TCP或UDP连接,进行网络通信.数据的读写,可以使用我们熟悉的stream进行操作. T ...
- Subversion客户端接受服务器证书出现“The certificate hostname does not match”的问题
当使用https://形式的URL连接Apache时,Subversion客户端将会受到两个类型的响应: 1.一个服务器证书 2.一个针对客户端证书的请求 在本人的应用场景主要涉及SVN仓库迁移的操作 ...
- [转载] c#中decimal ,double,float的区别
一直很奇怪C#的预定义数据类型中为什么加了一个decimal,有float和double不就够了吗?今天来挖一挖. 浮点型 Name CTS Type De script ion Significan ...
- webstorm实用快捷键
webstorm实用快捷键 Ctrl+/ 或 Ctrl+Shift+/ 注释(// 或者/*…*/ ) Shift+F6 重构-重命名 Ctrl+X 删除行 Ctrl+D 复制行 Ctrl+G 查找行 ...
- OCR技术初识
一.什么是OCR OCR英文全称是Optical Character Recognition,中文叫做光学字符识别.它是利用光学技术和计算机技术把印在或写在纸上的文字读取出来,并转换成一种计算机能够接 ...
- python的类和对象
一.面向对象和面向过程 1.1面向过程的特点 优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可. 缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身. 1.2面 ...
- makefile 变量展开
Makefile中给变量赋值: = 是递归展开式变量 value1 = 5 value2 = $(value1) value1 = 6 最终$(value2)就变成了6 := 是直接展开 ...
- 【web前端】移动端控制台插件,手机端页面查看相关页面控制台信息
一般调试手机端页面时,基本是在PC端使用手机模式进行断点或console调试.或查看有用的控制台信息的,但依旧有部分功能无法在PC端调试,经常需要使用alert进行断点,然后在手机端看效果,但是这样并 ...
- PHP结合Vue实现上拉分页
效果图: <?php if(isset($_GET['data'])){ $data = [ [ 'title'=>1], [ 'title'=>2], [ 'title'=> ...