NOIP2015Day2T3运输计划(二分+树上差分)
做了这么多NOIPTG的题,这是唯一 一道一眼秒的T3(有时候T2还不会做QAQ)。。。
题目大意就不说了QWQ
思路大概是:啊最大值最小化,来个二分。检验mid的话,显然就是用最长路径减去所有边权>mid的边的交边中最大值,如果不大于mid就可行,那树上差分呀!(完)
神tmDay2 T1T3都有最大值最小化
之前写过加点权的树上差分,就是这题(戳我)。。。然后自己yy出了边的树上差分,其实和点一个道理,因为每个点的父亲边只有一条,于是给这个点加一个权值数组表示父亲边被使用的次数。每有一条路径(u,v)加入就cnt[u]++,cnt[v]++,cnt[lca(u,v)]-=2,那某个点x的父亲边被使用的次数就是x这棵子树的权值和辣!
一开始只拿了80分。。因为我在没有建好树的情况下,也就是刚刚读入两个点及其边权(x,y,z)时直接就val[y]++了,这时候还不知道x和y谁是父亲QAQ
代码如下:
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;
struct poi{int too,pre,dis;}e[],lik[];
int n,m,x,y,z,l,r,mid,mx,val[],fa[],tot,tot2,q[][],cntt[];
int cnt[],last[],last2[],d[];
bool v[];
void add(int x,int y,int z){e[++tot].too=y;e[tot].dis=z;e[tot].pre=last[x];last[x]=tot;}
void add2(int x,int y,int z){lik[++tot2].too=y;lik[tot2].dis=z;lik[tot2].pre=last2[x];last2[x]=tot2;}
int gf(int x){return fa[x]==x?x:fa[x]=gf(fa[x]);}
void tarjan(int x)
{
v[x]=;fa[x]=x;
for(int i=last2[x];i;i=lik[i].pre)if(v[lik[i].too])q[lik[i].dis][]=gf(lik[i].too);
for(int i=last[x],too=e[i].too;i;i=e[i].pre,too=e[i].too)if(!v[too])d[too]=d[x]+e[i].dis,tarjan(too),fa[too]=x;
}
int dfs(int x,int fa)
{
int sum=cnt[x];
for(int i=last[x],too=e[i].too;i;i=e[i].pre,too=e[i].too)if(too!=fa)val[too]=e[i].dis,sum+=dfs(too,x);
return cntt[x]=sum;
}
bool ck()
{
int total=,mxx=;
memset(cnt,,sizeof(cnt));
for(int i=;i<=m;i++)if(d[q[i][]]+d[q[i][]]-*d[q[i][]]>mid)total++,cnt[q[i][]]++,cnt[q[i][]]++,cnt[q[i][]]-=;
dfs(,);
for(int i=;i<=n;i++)if(cntt[i]==total&&val[i]>mxx)mxx=val[i];
return mx-mxx<=mid;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n-;i++)scanf("%d%d%d",&x,&y,&z),add(x,y,z),add(y,x,z);
for(int i=;i<=m;i++)scanf("%d%d",&x,&y),add2(x,y,i),add2(y,x,i),q[i][]=x,q[i][]=y;
tarjan();
for(int i=;i<=m;i++)mx=max(mx,d[q[i][]]+d[q[i][]]-*d[q[i][]]);
l=;r=mx;
while(l<r)
{
mid=(l+r)/;
if(ck())r=mid;else l=mid+;
}
printf("%d\n",l);
}
NOIP2015Day2T3运输计划(二分+树上差分)的更多相关文章
- 洛谷 P2680 运输计划-二分+树上差分(边权覆盖)
P2680 运输计划 题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条 ...
- P2680 运输计划 二分+树上差分
又咕咕了几天\(QwQ\) 思路:二分+树上差分 提交:\(\geq5\)次 错因:\(lca\)写错+卡了很久常数(哪位大佬帮我康康,有更好的写法请指出\(QwQ\)) 题解: 我们先将原问题转化为 ...
- BZOJ 4326 NOIP2015 运输计划 (二分+树上差分)
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1930 Solved: 1231[Submit][Statu ...
- Luogu P2680 运输计划(二分+树上差分)
P2680 运输计划 题意 题目背景 公元\(2044\)年,人类进入了宇宙纪元. 题目描述 公元\(2044\)年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道 ...
- BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MB Submit: 1388 Solved: 860 [Submit][Stat ...
- [NOIP2015]运输计划(树上差分+LCA+二分)
Description 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球. 小 P 掌管 ...
- 洛谷P2680 运输计划(树上差分+二分)
传送门 考虑树上乱搞 首先这是满足二分性质的,如果在某个时间可以完成工作那么比他更长的时间肯定也能完成工作 然后考虑二分,设当前答案为$mid$,如果有一条链的长度大于$mid$,那么这条链上必须得删 ...
- vijos 运输计划 - 二分答案 - 差分 - Tarjan
Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球.小 P 掌管一家 ...
- 【Luogu】P2680运输计划(树上差分+二分)
题目链接 总体思路……怎么说呢……是个暴力吧…… 首先用倍增预处理出每条路径的长度. 然后按长度把路径排序. 然后二分答案.对于当前答案mid检验,怎么检验呢? 首先差分把所有长度比mid大的链上除了 ...
随机推荐
- MySQL☞abs函数
abs( )函数:求出绝对值 格式: select abs(数值) from 表名 如下图:
- 接口文档神器--apiui的使用
接口开发,最麻烦的就是写文档了,曾经我也因为写接口文档苦不堪言:自从使用了apiui接口文档神器,工作效率和文档清晰得到了不止一个档次的提升. 下面介绍一下这个神器的使用: 把文件下载下来,放在网站根 ...
- leetcode-位1的个数(位与运算)
位1的个数 编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量). 示例 : 输入: 11 输出: 3 解释: 整数 11 的二进制表示为 00000 ...
- [Clr via C#读书笔记]Cp1CLR执行模型
Cp1CLR执行模型 本章的概念点 CLR=Common Language Runtime 内存管理,程序集加载,安全性,异常处理和线程同步.CLR是基础,支持着面向它的各种语言.各种语言会被对应的编 ...
- ionic 日期插件学习
<ion-header> <ion-navbar> <ion-title> DateTime </ion-title> </ion-navbar& ...
- leetcode个人题解——#20 Valid Parentheses
class Solution { public: bool isValid(string s) { stack<char> brackts; ; i < s.size(); i++) ...
- Linux内核设计笔记13——虚拟文件系统
虚拟文件系统 内核在它的底层文件系统系统接口上建立一个抽象层,该抽象层使Linux可以支持各种文件系统,即便他们在功能和行为上存在很大差异. VFS抽象层定义了各个文件系统都支持的基本的.概念上的接口 ...
- DataSet转化为DataTable
. DataTable dt = ds.Tables[]; . DataTable dt = dao.FillTables("GetOptions_DKI_City_HCPName" ...
- iscroll手册
概述: 大家在日常工作中最常用的插件是什么,jQurey?Lazyload?但是这些都是在PC端,但是在移动端最常用的插件莫过于iScroll了,iScroll到底是什么东西,应该怎么用?iScrol ...
- 欢迎来怼--第二十一次Scrum会议
一.小组信息 队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华 小组照片 二.开会信息 时间:2017/11/2 17:05~17:15,总计10min. 地点: ...