【题目链接】: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. (入门整理学习一)Asp.net core

    1.安装.net code SDK,vs Code;vs code c#插件可在软件扩展 (我网盘有)  vs2015上安装教程:http://www.cnblogs.com/wangrudong00 ...

  2. SPRINGAOP实现基于注解的数据源动态切换(转)

    需求 代码实现读写数据库分离 武器 spring3.0以上版本 实现思路 1.继承org.springframework.jdbc.datasource.lookup.AbstractRoutingD ...

  3. 51NOD——N 1107 斜率小于0的连线数量

    https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1107 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 ...

  4. x264代码剖析(十五):核心算法之宏块编码中的变换编码

    x264代码剖析(十五):核心算法之宏块编码中的变换编码 为了进一步节省图像的传输码率.须要对图像进行压缩,通常採用变换编码及量化来消除图像中的相关性以降低图像编码的动态范围.本文主要介绍变换编码的相 ...

  5. codeforces Round 246 D. Prefixes and Suffixes (后缀数组 || KMP)

    题目大意: 求一个子串,子串既是前缀又是后缀. 然后再求出它在整个串中出现的次数. 思路分析: 能够非常easy想到怎样推断一个串既是前缀又是后缀. 仅仅须要它与 sa[0] 的lcp 等于 整个串的 ...

  6. OC学习篇之---类的定义

    OC中类的相关知识 OC和C的最大区别就是具有了面向对象的功能,那么说到面向对象,就不得不说类这个概念了,如果学过Java的话,那么对类和对象的概念就不陌生了,因为Java是非常纯正的面向对象设计语言 ...

  7. 快速理解Java中的五种单例模式(转)

    解法一:只适合单线程环境(不好) package test; /** * @author xiaoping * */ public class Singleton { private static S ...

  8. FragmentPagerAdapter和FragmentStatePagerAdapter的差别

    ViewPager同意用户通过左右滑动显示不同页面的数据.而这些页面须要PagerAdapter管理. 经常使用的有FragmentPagerAdapter和FragmentStatePagerAda ...

  9. Vue源码--解读vue响应式原理

    原文链接:https://geniuspeng.github.io/2018/01/05/vue-reactivity/ Vue的官方说明里有深入响应式原理这一节.在此官方也提到过: 当你把一个普通的 ...

  10. 如何在 BitNami 中创建多个 WEB 应用?(转)

    本文最后更新于2015年7月14日,已超过半年没有更新,如果内容失效,请反馈,谢谢! 如您所知,BitNami 为诸多开源 WEB 应用提供集成环境的一键安装解决方案,像著名的开源 WEB 程序 Wo ...