【题目链接】: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. PatentTips - Maintaining shadow page tables in a sequestered memory region

    BACKGROUND Malicious code, known as malware, which includes viruses, worms, adware, etc., may attack ...

  2. Android开发之搜芽项目的图片载入问题(使用Volley进行网络图片载入)

    搜芽的移动开发这几天进度相对来说很的快. 可是美中不足的就是网络图片的载入问题. 我有两套方案: 1)沿用迅雷动漫的图片载入.迅雷动漫也是用的一个开源的库.可是不知道是我使用出了问题还是真的是它的问题 ...

  3. Altium Designer如何删除以布的线

  4. JS学习笔记 - fgm练习 - 多按钮控制同个div属性

    总结: 1. 注意body里的结构安排,全部装在大div,避免多次设置不同部分居中. 2. 一排按钮居中:装在大div里,text-align: center; 3. 把相同的部分封装成函数,即 同个 ...

  5. 【Codeforces Round #299 (Div. 2) C】 Tavas and Karafs

    [链接] 我是链接,点我呀:) [题意] 给你一个规则,让你知道第i根萝卜的高度为si = A+(i-1)*B 现在给你n个询问; 每次询问给你一个固定的起点l; 让你找一个最大的右端点r; 使得l. ...

  6. java程序猿经常使用的工具名称--知道中文意思吗

    在学习java的时候常常会碰到一些单词,可是一般的时候也不是非常在意这个单词的意思,而是能够了解到这个工具或者框架能够做什么就能够了.偶尔总结了一下还蛮有意思的.例如以下, 假设有遗漏,各位能够帮忙补 ...

  7. Ansible 管理服务和软件

    [root@Ansible ~]# ansible RAC -m yum -a 'name=iscsi-initiator-utils state=installed' RAC_Node1 | suc ...

  8. tensorflow 的 Batch Normalization 实现(tf.nn.moments、tf.nn.batch_normalization)

    tensorflow 在实现 Batch Normalization(各个网络层输出的归一化)时,主要用到以下两个 api: tf.nn.moments(x, axes, name=None, kee ...

  9. 15.1 linux操作系统下nand flash驱动框架2

    当我们需要在操作系统上读写普通文件的时候,总是需要一层层往下,最终到达硬件相关操作,当然底层设备大多数都是块设备 NAND FLASH就作为一个最底层的块设备. 而写驱动,就是要构建硬件与操作系统之间 ...

  10. spring mvc controller间跳转 重定向 传参(转)

    spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...