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. Joomla 3.0.0 --> 3.4.6-RCE复现

    Joomla是一款网站管理系统CMS,最近曝出其3.00-3.4.6的joomla版本存在一个RCE漏洞. 并且大佬已将exp放在了github上,下载地址:https://www.exploit-d ...

  2. Bubble Sort HDU - 5775 树状数组

    //每个数字只会被它后面的比它小的数字影响,且会向右移动相应个数的位置 //比如:6 4 3 5 2 1 .4后面比它小的有 三个,因此它的最右边位置就是当前位置 +3,即5 //如果该数字本身在标准 ...

  3. asp.net web core 开发问题汇总(1)

    1   ASP.NET Core 设置默认静态起始页 转载地址:ASP.NET Core 设置默认起始页(如default.html) 注:1  默认情况下ASP.NET Core应用程序时不支持静态 ...

  4. vjudge 棋盘

    原题目链接:https://vjudge.net/contest/331118#problem/B 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放 ...

  5. js 获取项目名称

    //获取项目名称function getWebName(){ var pathName = window.location.pathname.substring(1); var webName = p ...

  6. hive创建表时报错

    这是因为mysql字符集的原因.修改mysql的字符集. mysql> alter database hive character set latin1; 参考博客:https://blog.c ...

  7. vue formatter element表格处理数据

    formatter 指定一个vue methods 方法 作用:对从数据库中取出的数据进行处理后展示. <el-table-column prop="partner1" // ...

  8. Hibernate的save方法不能进行数据库插入

    问题描述 在 MyEcplise 上运行 tomcat,利用 po 模板自动生成 po 文件,调用 po 的 save 方法,不报错,但是无法把数据插入数据库 applicationContext.x ...

  9. linux - python:卸载

    [root@test ~]# rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps ##强制删除已安装程序及其关联[root@test ~]# ...

  10. Matlab的sort函数

    1.Matlab自带排序函数sort用法     [Y,I] = sort(X,DIM,MODE)     sort函数默认Mode为'ascend'为升序,sort(X,'descend')为降序排 ...