4515: [Sdoi2016]游戏

链接

分析:

  树链剖分 + 超哥线段树。注意细节。

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
#define Root 1, n, 1
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
const LL INF = 123456789123456789ll;
struct Edge{ int to, nxt, w; } e[N << ];
int head[N], dep[N], siz[N], fa[N], son[N], dfn[N], bel[N], n, En, Index;
LL dis[N];
struct Line{
LL k, b;
Line() { k = , b = INF; }
Line(LL _k,LL _b) { k = _k, b = _b; }
LL f(LL x) { return x * k + b; }
}; inline void add_edge(int u,int v,int w) {
++En; e[En].to = v, e[En].w = w, e[En].nxt = head[u]; head[u] = En;
++En; e[En].to = u, e[En].w = w, e[En].nxt = head[v]; head[v] = En;
} struct SegmentTree{
LL ans[N << ], A[N]; Line T[N << ];
void init() {
for (int i = ; i <= (N << ); ++i) ans[i] = INF;
}
inline void pushup(int rt) { ans[rt] = min(ans[rt], min(ans[rt << ], ans[rt << | ])); }
void Cover(int l,int r,int rt,Line v) {
int mid = (l + r) >> ;
if (v.f(A[mid]) < T[rt].f(A[mid])) ans[rt] = min(ans[rt], min(v.f(A[l]), v.f(A[r]))), swap(v, T[rt]); // A[l]!!!
if (l == r) return ;
if (v.f(A[l]) > T[rt].f(A[l]) && v.f(A[r]) > T[rt].f(A[r])) return ;
if (v.k > T[rt].k) Cover(lson, v);
else Cover(rson, v);
pushup(rt);
}
void update(int l,int r,int rt,int L,int R,Line v) {
if (L <= l && r <= R) { Cover(l, r, rt, v); return ; }
int mid = (l + r) >> ;
if (L <= mid) update(lson, L, R, v);
if (R > mid) update(rson, L, R, v);
pushup(rt);
}
LL query(int l,int r,int rt,int L,int R) {
if (L <= l && r <= R) return ans[rt]; // L <= r !!!
int mid = (l + r) >> ;
LL res = min(T[rt].f(A[max(l, L)]), T[rt].f(A[min(r, R)]));
if (L <= mid) res = min(res, query(lson, L, R));
if (R > mid) res = min(res, query(rson, L, R));
return res;
}
}T;
void dfs1(int u) {
dep[u] = dep[fa[u]] + ;
siz[u] = ;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (v == fa[u]) continue;
fa[v] = u;
dis[v] = dis[u] + e[i].w;
dfs1(v);
siz[u] += siz[v];
if (!son[u] || siz[son[u]] < siz[v]) son[u] = v;
}
}
void dfs2(int u,int top) {
bel[u] = top;
dfn[u] = ++Index; T.A[Index] = dis[u];
if (!son[u]) return ;
dfs2(son[u], top);
for (int i = head[u]; i; i = e[i].nxt)
if (e[i].to != fa[u] && e[i].to != son[u]) dfs2(e[i].to, e[i].to);
}
int LCA(int u,int v) {
while (bel[u] != bel[v]) dep[bel[u]] > dep[bel[v]] ? u = fa[bel[u]] : v = fa[bel[v]];
return dep[u] < dep[v] ? u : v;
}
void Change(int u,int w,Line x) {
while (bel[u] != bel[w])
T.update(Root, dfn[bel[u]], dfn[u], x), u = fa[bel[u]];
T.update(Root, dfn[w], dfn[u], x);
}
void Query() {
int u = read(), v = read(); LL res = INF;
while (bel[u] != bel[v]) {
if (dep[bel[u]] < dep[bel[v]]) swap(u, v);
res = min(res, T.query(Root, dfn[bel[u]], dfn[u]));
u = fa[bel[u]];
}
if (dep[u] < dep[v]) swap(u, v);
res = min(res, T.query(Root, dfn[v], dfn[u]));
printf("%lld\n", res);
}
int main() {
n = read();int m = read();
for (int i = ; i < n; ++i) {
int u = read(), v = read(), w = read();
add_edge(u, v, w);
}
dfs1(); dfs2(, ); T.init();
while (m --) {
int opt = read();
if (opt == ) {
int u = read(), v = read(), w = LCA(u, v);LL a = read(), b = read();
Change(u, w, Line(-a, b + dis[u] * a));
Change(v, w, Line(a, b + a * (dis[u] - (dis[w] << ))));
}
else Query();
}
return ;
}

4515: [Sdoi2016]游戏的更多相关文章

  1. bzoj 4515: [Sdoi2016]游戏

    Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,Alice 会 ...

  2. BZOJ.4515.[SDOI2016]游戏(树链剖分 李超线段树)

    BZOJ 洛谷 每次在路径上加的数是个一次函数,容易看出是树剖+李超线段树维护函数最小值.所以其实依旧是模板题. 横坐标自然是取个确定的距离标准.取每个点到根节点的距离\(dis[i]\)作为\(i\ ...

  3. 【BZOJ4515】[Sdoi2016]游戏 树链剖分+线段树

    [BZOJ4515][Sdoi2016]游戏 Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 1234567 ...

  4. BZOJ4515: [Sdoi2016]游戏

    Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,Alice 会 ...

  5. bzoj千题计划276:bzoj4515: [Sdoi2016]游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=4515 把lca带进式子,得到新的式子 然后就是 维护树上一次函数取min 一个调了一下午的错误: 当 ...

  6. [SDOI2016]游戏

    Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,Alice 会 ...

  7. Luogu 4069 [SDOI2016]游戏

    BZOJ 4515 树链剖分 + 李超线段树 要求支持区间插入一条线段,然后查询一个区间内的最小值.可以使用李超线段树解决,因为要维护一个区间内的最小值,所以每一个结点再维护一个$res$表示这个区间 ...

  8. [bzoj4515][Sdoi2016]游戏-树链剖分+李超线段树

    Brief Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,A ...

  9. 【题解】Luogu P4069 [SDOI2016]游戏

    原题传送门 看到这种题,想都不用想,先写一个树链剖分 然后发现修改操作增加的是等差数列,这使我们想到了李超线段树 先进性树剖,然后用李超线段树维护区间最小,这样就做完了(写码很容易出错) 复杂度为\( ...

随机推荐

  1. 申请Let’s Encrypt永久免费SSL证书过程教程及常见问题

    配置证书https://easy.zhetao.com/   虽然目前Let’s Encrypt免费SSL证书默认是90天有效期,但是我们也可以到期自动续约,不影响我们的尝试和使用,为了考虑到文章的真 ...

  2. matlab中关于函数句柄、feval函数以及inline函数的解析 (转)

    http://blog.sina.com.cn/s/blog_7bff755b010180l3.html MATLAB函数句柄 函数句柄(Function handle)是MATLAB的一种数据类型. ...

  3. Linux 下shell 编程学习脚手架

    linux body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-t ...

  4. Word、rss、HTML解析等dll

    RSS.NET.dll RSS.NET是一款操作RSS feeds的开源.NET类库.它为解析和编写RSS feeds提供了一个可重用的对象模型.它完全兼容RSS 0.90, 0.91, 0.92, ...

  5. "字符串"经过strip 之后还是字符串, 而"字符串"经过split 分开后,就变成了一个列表["x","xx","xxx"]

    "字符串"经过strip 之后还是字符串, 而"字符串"经过split 分开后,就变成了一个列表["x","xx",&q ...

  6. C++ 课堂作业1.0

    c++第一次课堂作业点这里 题目要求:输入半径,计算圆的面积,在调用外部函数,无需使用类.

  7. 第二次作业 APP分析

    第一部分 调研, 评测 1.下载软件并使用. 今天我要分析的软件app是UC浏览器这个软件,UC浏览器的用户群体还是挺多的,作为一款主流之一的浏览器APP,整体的用户体验还是很好的.简洁的界面还有中间 ...

  8. TCP socket和web socket的区别

    小编先习惯性的看了下某中文百科网站对Web Socket的介绍,觉得很囧.如果大家按照这个答案去参加BAT等互联网公司的前端开发面试,估计会被鄙视. 还是让我们阅读一些英文材料吧. 让我们直接看sta ...

  9. Hadoop学习之路(三)Hadoop-2.7.5在CentOS-6.7上的编译

    下载Hadoop源码 1.登录官网 2.确定你要安装的软件的版本 一个选取原则: 不新不旧的稳定版本 几个标准: 1)一般来说,刚刚发布的大版本都是有很多问题 2)应该选择某个大版本中的最后一个小版本 ...

  10. pl/sql连接远程oracle

    1.找到oracle安装程序下的网络配置助手 2.选中本地net服务,进行添加 3.输入远程oracle服务名 4.选中tcp协议 5.输入远程oracle的ip地址 6.在网络服务名处,随便输入一个 ...