题目链接  BZOJ4326

这个程序在洛谷上TLE了……惨遭卡常

在NOIP赛场上估计只能拿到95分吧= =

把边权转化成点权

首先求出每一条路径的长度

考虑二分答案,$check(now)$

对于当前那些长度大于$now$的路径,用差分求出这些路径经过的点的次数

设这些路径条数为l, 长度最大的路径减去$now$的值为$mx$

(点$x1$经过$y1$次,点$x2$经过$y2$次,..., 点$xm$经过$ym$次)

如果我们能找到一条边(一个点),满足$xk = l$ 且 $yk >= mx$ 则$check$成功,否则失败。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)    for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair
#define fi first
#define se second typedef long long LL;
typedef pair <int, int> PII; const int N = 3e5 + 10; struct node{
int x, y, lca, w;
void scan(){ scanf("%d%d", &x, &y);}
void print(){ printf("%d %d %d %d\n", x, y, lca, w);}
} path[N]; int father[N], deep[N], sz[N], son[N], top[N];
int a[N], b[N], f[N], g[N];
int n, m, x, y, z, l, r, ans;
vector <PII> v[N]; void dfs(int x, int fa, int dep, int now){
sz[x] = 1;
deep[x] = dep;
father[x] = fa;
a[x] = now;
b[x] = b[fa] + a[x];
int ct = (int)v[x].size();
rep(i, 0, ct - 1){
int u = v[x][i].fi;
if (u == fa) continue;
dfs(u, x, dep + 1, v[x][i].se);
sz[x] += sz[u];
if (sz[son[x]] < sz[u]) son[x] = u;
}
} void dfs2(int x, int fa, int tp){
top[x] = tp;
if (son[x]) dfs2(son[x], x, tp);
int ct = (int)v[x].size();
rep(i, 0, ct - 1){
int u = v[x][i].fi;
if (u == son[x] || u == fa) continue;
dfs2(u, x, u);
}
} void calc(int x, int fa){
int ct = (int)v[x].size();
rep(i, 0, ct - 1){
int u = v[x][i].fi;
if (u == fa) continue;
calc(u, x);
f[x] += f[u];
}
} int LCA(int x, int y){
for (; top[x] ^ top[y]; ){
if (deep[top[x]] < deep[top[y]]) swap(x, y);
x = father[top[x]];
} return deep[x] > deep[y] ? y : x;
} bool check(int now){
int cnt = 0;
int mx = 0;
memset(f, 0, sizeof f);
rep(i, 1, m) if (path[i].w > now){
int x = path[i].x, y = path[i].y, w = path[i].w, lca = path[i].lca;
++cnt;
if (lca == y) ++f[x], --f[y];
else ++f[x], ++f[y], f[lca] -= 2;
mx = max(mx, w - now);
} calc(1, 0);
rep(i, 1, n) if (a[i] >= mx && f[i] == cnt) return true;
return false;
} int main(){ scanf("%d%d", &n, &m);
rep(i, 2, n){
scanf("%d%d%d", &x, &y, &z);
v[x].push_back(MP(y, z));
v[y].push_back(MP(x, z));
} dfs(1, 0, 0, 0);
dfs2(1, 0, 1); rep(i, 1, m){
path[i].scan();
if (deep[path[i].x] < deep[path[i].y]) swap(path[i].x, path[i].y);
path[i].lca = LCA(path[i].x, path[i].y);
path[i].w = b[path[i].x] + b[path[i].y] - 2 * b[path[i].lca];
} l = 0, r = 3e8;
while (l + 1 < r){
int mid = l + r >> 1;
if (check(mid)) r = mid; else l = mid + 1;
} if (check(l)) ans = l; else ans = r;
printf("%d\n", ans);
return 0;
}

BZOJ 4326 NOIP2015 运输计划(二分答案 + 树上差分思想)的更多相关文章

  1. BZOJ 4326: NOIP2015 运输计划(二分,树上差分)

    Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1945  Solved: 1243[Submit][Status][Discuss] Descript ...

  2. BZOJ 4326 NOIP2015 运输计划 (二分+树上差分)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1930  Solved: 1231[Submit][Statu ...

  3. [luogu]P2680 运输计划[二分答案][树上差分]

    [luogu]P2680 [NOIP2015]运输计划 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n ...

  4. loj2425 「NOIP2015」运输计划[二分答案+树上差分]

    看到题意最小化最长路径,显然二分答案,枚举链长度不超过$\text{mid}$,然后尝试检验.````` 检验是否存在这样一个边置为0后,全部链长$\le\text{mid}$,其最终目标就是.要让所 ...

  5. luogu P2680 运输计划 (二分答案+树上差分)

    题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间 ...

  6. BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 1388  Solved: 860 [Submit][Stat ...

  7. bzoj 4326: NOIP2015 运输计划【树链剖分+二分+树上差分】

    常数巨大,lg上开o2才能A 首先预处理出运输计划的长度len和lca,然后二分一个长度w,对于长度大于w的运输计划,在树上差分(d[u]+1,d[v]+1,d[lca]-2),然后dfs,找出所有覆 ...

  8. bzoj 4326: NOIP2015 运输计划

    4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MB Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个 ...

  9. bzoj 4326: NOIP2015 运输计划(二分+树链剖分)

    传送门 题解: 树链剖分快速求解任意两点间的路径的权值和: 然后,二分答案: 此题的难点是如何快速求解重合路径? 差分数组可以否??? 在此之前先介绍一下相关变量: int fa[maxn]; int ...

随机推荐

  1. 如何用纯 CSS 创作一个文本淡入淡出的 loader 动画

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ERwpeG 可交互视频 ...

  2. python GIL锁、进程池与线程池、同步异步

    一.GIL全局解释器锁 全局解释器锁 在CPython中,全局解释器锁(GIL)是一个互斥锁,它可以防止多个本机线程同时执行Python代码.之所以需要这个锁,主要是因为CPython的内存管理不是线 ...

  3. 用Python抓取并分析了1982场英雄联盟数据,教你开局前预测游戏对局胜负!

    英雄联盟想必大多数读者不会陌生,这是一款来自拳头,由腾讯代理的大型网络游戏,现在一进网吧,你就能发现一大片玩英雄联盟的人.在2017年中国战队无缘鸟巢的世界总决赛后,一大片人选择了弃游,只是终究没躲过 ...

  4. HDU - 1496 Equations (hash)

    题意: 多组测试数据. 每组数据有一个方程 a*x1^2 + b*x2^2 + c*x3^2 + d*x4^2 = 0,方程中四个未知数 x1, x2, x3, x4 ∈ [-100, 100], 且 ...

  5. 包含min函数的栈 【微软面试100题 第二题】

    题目要求:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 参考题目:剑指offer第21题. 题目分析: 1. ...

  6. IOS开发之----全局变量extern的使用

    extern,作用在IOS中,为了使用全局变量.比写在appDelegate和定义单例方便一些: 举例: 1.MyExternClass.h添加这个类,并在.m文件添加 代码 #import &quo ...

  7. 【Java学习笔记之九】java二维数组及其多维数组的内存应用拓展延伸

    多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...

  8. python安装和eclipse安装及环境变量配置

    非常好的技术文档,链接如下: http://jingyan.baidu.com/article/eb9f7b6da950c4869364e8f5.html 感谢作者的分享 http://python. ...

  9. GBDT 与 XGBoost

    GBDT & XGBoost ### 回归树 单棵回归树可以表示成如下的数学形式 \[ f(x) = \sum_j^Tw_j\mathbf{I}(x\in R_j) \] 其中\(T\)为叶节 ...

  10. [python subprocess学习篇] 调用系统命令

    http://www.jb51.net/article/57208.htm 3).Popen.communicate(input=None):与子进程进行交互.向stdin发送数据,或从stdout和 ...