题解——洛谷 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 国的首都爆发了一种危害性极高的传染病.当局为了控 ...
随机推荐
- linux本地机上传文件到服务器
最近工作全部切换到了linux环境下,就是吃喝拉撒全在linux下,微信,web端,qq,web端,-------,各种socket编程,网络通讯- 本地linux机从阿里云下载文件
- Helter Skelter (扫描线 + 离散化 + 树状数组)
扫描线:按照其中一个区间的标记为pos,然后左区间标记d为正影响,有区间标记d为负影响,然后根据所有的pos排序.pos从小扫到大,那么对于某一个区间一定会被扫过2次,那么经过2次之后就只剩下中间那一 ...
- 20155228 2016-2017-2 《Java程序设计》第6周学习总结
20155228 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 输入与输出 在Java中输入串流代表对象为java.io.InputStream实例,输出串 ...
- Python 第四阶段 学习记录之----多线程
多线程 多线程例子, 注释部份即为多线程的使用 #-*- coding: utf-8 -*- # Wind clear raise # 2017/3/5 下午2:34 import socket im ...
- XML系列之--创建电文格式的XML(一)
关于XML,学校那会,老师在口中仅仅提及,自己也未曾深入接触过,仅是些将最基本XML文件内容显示在web定义的表格中之类的简单操作,如今项目中的收发电文涉及到复杂XML的操作.趁此契机好好回顾下XML ...
- restful的特点
1. 资源(Resources) REST的名称”表现层状态转化”中,省略了主语.”表现层”其实指的是”资源”(Resources)的”表现层”. 所谓”资源”,就是网络 ...
- NGINX的几个应用场景
NGINX的几个应用场景 两个参考地址: NGINX的百度百科:https://baike.baidu.com/item/nginx/3817705?fr=aladdin NGINX的中文网站:htt ...
- flask 操作数据库(分类)
数据库 数据库是大多数动态web程序的基础设施,只要你想把数据存下来,就离不开数据库. 这里所说的数据库指的是有存储数据的单个或多个文件组成的集合,它是一种容器,可以类比文文件柜.而人们通常使用数据库 ...
- 如何干净卸载mysql
一.在控制面板中卸载mysql软件: 二.卸载过后删除C:\Program Files (x86)\MySQL该目录下剩余了所有文件,把mysql文件夹也删了: 三.windows+R运行“reged ...
- GoldenGate 12.3 MA架构介绍系列(2) - 数据同步测试
安装配置可参考上一篇:http://www.cnblogs.com/margiex/p/8071957.html 安装完成之后,会自动启动ServiceManager服务,此时,可以通过浏览器访问. ...