【题目链接】:http://www.lydsy.com/JudgeOnline/problem.php?id=1036

【题意】

【题解】



树链剖分入门题;

每一条链维护一个线段树就好;

uppest数组维护这条链的最顶端的元素;

一条链一条链的往上走;直到两个点在同一条链里面了

balabala



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x) typedef pair<int, int> pii;
typedef pair<LL, LL> pll; const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 3e4+100;
const int INF = 3e4 + 200; int n,fa[N],siz[N],dep[N],uppest[N],bh[N],cnt;
int v[N],sum[N<<2],mx[N<<2];
vector <int> G[N]; void in()
{
rei(n);
rep1(i, 1, n - 1)
{
int x, y;
rei(x), rei(y);
G[x].pb(y), G[y].pb(x);
}
rep1(i, 1, n)
rei(v[i]);
} void dfs1(int x)
{
int len = G[x].size();
siz[x] = 1;
rep1(i, 0, len - 1)
{
int y = G[x][i];
if (y == fa[x]) continue;
fa[y] = x;
dep[y] = dep[x] + 1;
dfs1(y);
siz[x] += siz[y];
} } void dfs2(int x, int chain)
{
int len = G[x].size();
int k = 0;
bh[x] = ++cnt;
uppest[x] = chain;
rep1(i, 0, len - 1)
{
int y = G[x][i];
if (dep[y]>dep[x] && siz[y] > siz[k])
k = y;
}
if (k == 0) return;
dfs2(k, chain);
rep1(i, 0, len - 1)
{
int y = G[x][i];
if (dep[y] > dep[x] && y != k)
dfs2(y, y);
}
} void updata(int pos, int val,int l, int r, int rt)
{
if (l == r)
{
sum[rt] = mx[rt] = val;
return;
}
int m = (l + r) >> 1;
if (pos <= m)
updata(pos, val,lson);
else
updata(pos, val,rson);
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
mx[rt] = max(mx[rt << 1], mx[rt << 1 | 1]);
} int query_max(int L, int R, int l, int r, int rt)
{
if (L <= l && r <= R)
return mx[rt];
int m = (l + r) >> 1;
int temp1 = -INF;
if (L <= m)
temp1 = max(temp1, query_max(L, R, lson));
if (m < R)
temp1 = max(temp1, query_max(L, R, rson));
return temp1;
} int get_max(int u, int v)
{
int t = -3e4 - 100;
while (uppest[u] != uppest[v])
{
if (dep[uppest[u]] < dep[uppest[v]])
swap(u, v);
t = max(t, query_max(bh[uppest[u]], bh[u], 1, n, 1));
u = fa[uppest[u]];
}
if (dep[u] < dep[v])
swap(u, v);
t = max(t, query_max(bh[v], bh[u], 1, n, 1));
return t;
} int query_sum(int L, int R, int l, int r, int rt)
{
if (L <= l && r <= R)
return sum[rt];
int m = (l + r) >> 1;
int temp = 0;
if (L <= m)
temp += query_sum(L, R, lson);
if (m < R)
temp += query_sum(L, R, rson);
return temp;
} int get_sum(int u, int v)
{
int t = 0;
while (uppest[u] != uppest[v])
{
if (dep[uppest[u]] < dep[uppest[v]])
swap(u, v);
t += query_sum(bh[uppest[u]], bh[u], 1, n, 1);
u = fa[uppest[u]];
}
if (dep[u] < dep[v])
swap(u, v);
t+=query_sum(bh[v], bh[u], 1, n, 1);
return t;
} void get_ans()
{
rep1(i, 1, n)
updata(bh[i], v[i],1, n, 1);
int q;
rei(q);
char s[8];
rep1(i, 1, q)
{
scanf("%s", s);
if (s[0] == 'C')
{
int u, t;
rei(u), rei(t);
updata(bh[u], t, 1, n, 1);
}
else
{
int u, v;
rei(u), rei(v);
if (s[1] == 'M')
printf("%d\n", get_max(u, v));
else
printf("%d\n", get_sum(u, v));
}
}
} int main()
{
//freopen("F:\\rush.txt", "r", stdin); in();
dfs1(1);
dfs2(1, 1);
get_ans();
//printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}

【BZOJ 1036】[ZJOI2008]树的统计Count的更多相关文章

  1. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

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

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

  3. BZOJ 1036: [ZJOI2008]树的统计Count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 14354  Solved: 5802 [Subm ...

  4. bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)

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

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

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

  6. 数据结构(LCT动态树):BZOJ 1036: [ZJOI2008]树的统计Count

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

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

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

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

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

  9. bzoj 1036: [ZJOI2008]树的统计Count (树链剖分+线段树 点权)

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

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

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

随机推荐

  1. 字符串中的空格替换问题(Java版)

    解决方式一:时间复杂度为O(n^2) 解决方式二:时间复杂度为O(n) 代码实现: package string; public class SpaceStringReplace2 { //len为数 ...

  2. PHP从数组中删除元素的四种方法实例

    PHP从数组中删除元素的四种方法实例 一.总结 一句话总结:unset(),array_splice(),array_diff(),array_diff_key() 二.PHP从数组中删除元素的四种方 ...

  3. arduino串口输出问题

  4. 3、应用层常用lib函数使用说明

    1.mmap函数 void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset); start:映射区的开始地 ...

  5. SoC的Testbench中的简易bus_monitor(加入print函数)

    SoC的Testbench中的简易bus_monitor(加入print函数) 主要思路 向固定地址写信息 使用工具链将C写的print/printf函数编译成hex文件 在testbench中创建b ...

  6. ArcEngine数据删除几种方法和性能比较

    转自原文 ArcEngine数据删除几种方法和性能比较 一.  几种删除方法代码 1.  查询结果中删除 private void Delete1(IFeatureClass PFeatureclas ...

  7. CSDN学院 免费技术答疑公开课,本周三场即将开播~~~

    为了酬谢广大学员.CSDN学院特推出免费技术答疑公开课,让您开启一段充实的学习之旅~ 本周三场即将开播! ----------------------------------------------- ...

  8. Chrome 临时目录

    mklink /J "C:\Users\%USERNAME%\AppData\Local\Google\Chrome\User Data\Default\Cache" " ...

  9. 初识Visual Studio Code 一.使用Visual Studio Code 开发C# 控制台程序

    原文:初识Visual Studio Code 一.使用Visual Studio Code 开发C# 控制台程序 1. 安装.NET Core 安装包下载地址:https://www.microso ...

  10. 为何在查询中索引未被使用 (Doc ID 1549181.1)

        To Bottom * 为何在查询中索引未被使用 (Doc ID 1549181.1) To Bottom 文档内容 用途   排错步骤   高速检查   表上是否存在索引?   索引是否应该 ...