ps:这道题过的人真多啊

一道树剖的模板题

(好像还可以用lct做, 然而我并不会

代码如下

 /**************************************************************
Problem: 1036
User: cminus
Language: C++
Result: Accepted
Time:2380 ms
Memory:4052 kb
****************************************************************/ #include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = ;
#define ls (o << 1)
#define rs (ls + 1) int n, w[N];
int fa[N], size[N], hs[N], dep[N], top[N], pos[N], tot;
int maxn[N*], sum[N*], L, R;
vector < int > edge[N]; inline void dfs1(int u, int d, int f){
dep[u] = d; fa[u] = f; size[u] = ; hs[u] = -;
int tmp = ;
for (int i = ; i < edge[u].size(); i++){
int &v = edge[u][i];
if (v == f) continue;
dfs1(v, d + , u);
if (size[v] > tmp)
tmp = size[v], hs[u] = v;
size[u] += size[v];
}
} inline void dfs2(int u, int t){
top[u] = t, pos[u] = ++tot;
if (hs[u] == -) return ;
dfs2(hs[u], t);
for (int i = ; i < edge[u].size(); i++){
int &v = edge[u][i];
if (v != hs[u] && v != fa[u])
dfs2(v, v);
}
} inline int getSum(int o, int l, int r){
if (L <= l && r <= R) return sum[o];
int mid = (l + r) >> , ans = ;
if (L <= mid) ans += getSum(ls, l, mid);
if (R > mid) ans += getSum(rs, mid + , r);
return ans;
} inline int getMax(int o, int l, int r){
if (L <= l && r <= R) return maxn[o];
int mid = l + r >> , ans = -0x3f3f3f3f;
if (L <= mid) ans = max(ans, getMax(ls, l, mid));
if (R > mid) ans = max(ans, getMax(rs, mid + , r));
return ans;
} inline int getMax(int l, int r){
L = l, R = r;
return getMax(, , tot);
} inline int getSum(int l, int r){
L = l, R = r;
return getSum(, , tot);
} inline void queryMax(int u, int v){
int f1 = top[u], f2 = top[v], ans = -0x3f3f3f3f;
while(f1 != f2){
if (dep[f1] < dep[f2])
swap(u, v), swap(f1, f2);
ans = max(ans, getMax(pos[f1], pos[u]));
u = fa[f1]; f1 = top[u];
}
if (dep[u] > dep[v]) swap(u, v);
printf("%d\n", max(ans, getMax(pos[u], pos[v])));
} inline void querySum(int u, int v){
int f1 = top[u], f2 = top[v], ans = ;
while(f1 != f2){
if (dep[f1] < dep[f2])
swap(u, v), swap(f1, f2);
ans += getSum(pos[f1], pos[u]);
u = fa[f1]; f1 = top[u];
}
if (dep[u] > dep[v]) swap(u, v);
printf("%d\n", ans + getSum(pos[u], pos[v]));
} inline void modify(int o, int l, int r, int u, int a){
if(l == r){
sum[o] = maxn[o] = a;
return ;
}
int mid = l + r >> ;
if (u <= mid) modify(ls, l, mid, u, a);
else modify(rs, mid + , r, u, a);
sum[o] = sum[ls] + sum[rs];
maxn[o] = max(maxn[ls], maxn[rs]);
} int main(){
scanf("%d", &n);
for (int i = ; i < n; i++){
int x, y; scanf("%d %d", &x, &y);
edge[x].push_back(y);
edge[y].push_back(x);
}
for (int i = ; i <= n; i++) scanf("%d", &w[i]);
dfs1(, , -); dfs2(, );
for (int i = ; i <= n; i++)
modify(, , tot, pos[i], w[i]);
int q; scanf("%d", &q);
char str[]; int x, y;
while(q--){
scanf("%s%d%d", str, &x, &y);
if (!strcmp(str, "QMAX")) queryMax(x, y);
else if (*str == 'C') modify(, , tot, pos[x], y);
else querySum(x, y);
}
return ;
}

bzoj 1036: [ZJOI2008]树的统计Count (树链剖分)的更多相关文章

  1. BZOJ 1036: [ZJOI2008]树的统计Count [树链剖分]【学习笔记】

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 14302  Solved: 5779[Submit ...

  2. Bzoj 1036: [ZJOI2008]树的统计Count 树链剖分,LCT

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 11102  Solved: 4490[Submit ...

  3. BZOJ 1036: [ZJOI2008]树的统计Count( 树链剖分 )

    树链剖分... 不知道为什么跑这么慢 = = 调了一节课啊跪.. ------------------------------------------------------------------- ...

  4. bzoj 1036: [ZJOI2008]树的统计Count 树链剖分+线段树

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 16294  Solved: 6645[Submit ...

  5. BZOJ 1036: [ZJOI2008]树的统计Count (树链剖分模板题)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 14982  Solved: 6081[Submit ...

  6. BZOJ 1036 [ZJOI2008]树的统计Count (树链剖分)(线段树单点修改)

    [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 14968  Solved: 6079[Submit][Stat ...

  7. 【BZOJ1036】[ZJOI2008]树的统计Count 树链剖分

    [BZOJ1036][ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. ...

  8. bzoj1036 [ZJOI2008]树的统计Count 树链剖分模板题

    [ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u ...

  9. Cogs 1688. [ZJOI2008]树的统计Count(树链剖分+线段树||LCT)

    [ZJOI2008]树的统计Count ★★★ 输入文件:bzoj_1036.in 输出文件:bzoj_1036.out 简单对比 时间限制:5 s 内存限制:162 MB [题目描述] 一棵树上有n ...

  10. BZOJ 1036 [ZJOI2008]树的统计Count (树链剖分 - 点权剖分 - 单点权修改)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1036 树链剖分模版题,打的时候注意点就行.做这题的时候,真的傻了,单词拼错检查了一个多小时 ...

随机推荐

  1. 航空航天专用Everspin非易失性MRAM存储器

    TAMU是由瑞典乌普萨拉的Ångström航空航天公司(ÅAC)开发的高级磁力计子系统.TAMU的目的是提供地球磁场的磁力计数据,以便与子画面观测相关.实验性TAMU由使用领先技术制造的四种类型的设备 ...

  2. CF1280E Kirchhoff's Current Loss

    题意 做法 考虑一个子电路图\(G\),设得到有效电阻为\(x\),费用为\(f_G(x)\),通过归纳易得\(f_G(x)\)是关于\(x\)的一个一次函数,即\(f_G(x)=k_Gx\) 考虑电 ...

  3. hdu 1007 Quoit Design(平面最近点对)

    题意:求平面最近点对之间的距离 解:首先可以想到枚举的方法,枚举i,枚举j算点i和点j之间的距离,时间复杂度O(n2). 如果采用分治的思想,如果我们知道左半边点对答案d1,和右半边点的答案d2,如何 ...

  4. P1462 通往奥格瑞玛的道路【二分+Dij】

    P1462 通往奥格瑞玛的道路 提交 29.89k 通过 6.88k 时间限制 1.00s 内存限制 125.00MB 题目提供者gconeice 难度提高+/省选- 历史分数100 提交记录 查看题 ...

  5. 获取URL地址参数方法

    //获取url参数 getQueryVariable(variable){ var query =decodeURIComponent(window.location.search.substring ...

  6. Android开发菜单以及子菜单

    package com.example.androidtest; import android.app.Activity; import android.os.Bundle; import andro ...

  7. VSCode配置之open-with-Live-Server 无法打开浏览器【解决方法】

    如果你的vscode编辑器打开浏览器时默认打开的是iE,想要把它改为chrome,怎么办呢? 我遇到如下原因: 这是按照网上的setting.json配置 这是运行了 open-with-live-s ...

  8. jQuery使用ajax跨域请求获取数据

    jQuery使用ajax跨域请求获取数据  跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的 ...

  9. SVM-支持向量机(一)线性SVM分类

    SVM-支持向量机 SVM(Support Vector Machine)-支持向量机,是一个功能非常强大的机器学习模型,可以处理线性与非线性的分类.回归,甚至是异常检测.它也是机器学习中非常热门的算 ...

  10. TODO:rds数据库实例

    rds数据库实例怎么创建的 rds数据库实例高可用是怎么实现的 rds备份是怎么实现的 参考: https://www.cnblogs.com/jackyzzy/p/7384355.html http ...