Description

S国有N个城市,编号从1到N。城市间用N-1条双向道路连接,满足
从一个城市出发可以到达其它所有城市。每个城市信仰不同的宗教,如飞天面条神教、隐形独角兽教、绝地教都是常见的信仰。为了方便,我们用不同的正整数代表各种宗教,  S国的居民常常旅行。旅行时他们总会走最短路,并且为了避免麻烦,只在信仰和他们相同的城市留宿。当然旅程的终点也是信仰与他相同的城市。S国政府为每个城市标定了不同的旅行评级,旅行者们常会记下途中(包括起点和终点)留宿过的城市的评级总和或最大值。
    在S国的历史上常会发生以下几种事件:
”CC x c”:城市x的居民全体改信了c教;
”CW x w”:城市x的评级调整为w;
”QS x y”:一位旅行者从城市x出发,到城市y,并记下了途中留宿过的城市的评级总和;
”QM x y”:一位旅行者从城市x出发,到城市y,并记下了途中留宿过
的城市的评级最大值。
    由于年代久远,旅行者记下的数字已经遗失了,但记录开始之前每座城市的信仰与评级,还有事件记录本身是完好的。请根据这些信息,还原旅行者记下的数字。    为了方便,我们认为事件之间的间隔足够长,以致在任意一次旅行中,所有城市的评级和信仰保持不变。

Input

输入的第一行包含整数N,Q依次表示城市数和事件数。
    接下来N行,第i+l行两个整数Wi,Ci依次表示记录开始之前,城市i的
评级和信仰。
    接下来N-1行每行两个整数x,y表示一条双向道路。
    接下来Q行,每行一个操作,格式如上所述。

Output

对每个QS和QM事件,输出一行,表示旅行者记下的数字。

Sample Input

5 6
3 1
2 3
1 2
3 3
5 1
1 2
1 3
3 4
3 5
QS 1 5
CC 3 1
QS 1 5
CW 3 3
QS 1 5
QM 2 4

Sample Output

8
9
11
3

HINT

N,Q < =10^5    , C < =10^5

数据保证对所有QS和QM事件,起点和终点城市的信仰相同;在任意时

刻,城市的评级总是不大于10^4的正整数,且宗教值不大于C。

Source

 
树链剖分+动态开节点线段树
 
考虑对每一个宗教都建一颗线段树,动态开节点的方法跟主席树开节点的方法差不多(就是用&传个参)
然后就只有线段树单点修改和区间求和以及查询最大值
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define RG register
using namespace std;
const int N=100010;
const int M=200010;
const int K=N*50;
int size[N],deep[N],son[N],top[N],dfn[N],fa[N],tt,tot;
int head[N],to[M],nxt[M],cnt,n,q;
int tr[K][2],sum[K],Max[K],root[K],SUM,MAX,c[N],w[N];
char ch[N];
inline void dfs1(RG int x,RG int f){
size[x]=1;deep[x]=deep[f]+1;
for(RG int i=head[x];i;i=nxt[i]){
RG int y=to[i];
if(y!=f){
dfs1(y,x);fa[y]=x;
size[x]+=size[y];
if(size[y]>size[son[x]]) son[x]=y;
}
}
}
inline void dfs2(RG int x,RG int f){
top[x]=f;dfn[x]=++tt;
if(son[x]) dfs2(son[x],f);
for(RG int i=head[x];i;i=nxt[i]){
RG int y=to[i];
if(y!=fa[x]&&y!=son[x]) dfs2(y,y);
}
}
inline void pushup(RG int x){
RG int l=tr[x][0],r=tr[x][1];
sum[x]=sum[l]+sum[r];
Max[x]=max(Max[l],Max[r]);
}
inline void insert(RG int &x,RG int num,RG int v,RG int l,RG int r){
if(!x) x=++tot;
if(l==r){sum[x]=v;Max[x]=v;return;}
RG int mid=(l+r)>>1;
if(num<=mid) insert(tr[x][0],num,v,l,mid);
else insert(tr[x][1],num,v,mid+1,r);
pushup(x);
}
inline void query(RG int x,RG int l,RG int r,RG int xl,RG int xr){
if(!x) return;
if(xl<=l&&r<=xr) {SUM+=sum[x],MAX=max(MAX,Max[x]);return;}
RG int mid=(l+r)>>1;
if(xr<=mid) query(tr[x][0],l,mid,xl,xr);
else if(xl>mid) query(tr[x][1],mid+1,r,xl,xr);
else query(tr[x][0],l,mid,xl,mid),query(tr[x][1],mid+1,r,mid+1,xr);
}
inline void lca(RG int x,RG int y){
int C=c[x];
while(top[x]!=top[y]){
if(deep[top[x]]<deep[top[y]]) swap(x,y);
query(root[C],1,n,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if(deep[x]<deep[y]) swap(x,y);
query(root[C],1,n,dfn[y],dfn[x]);
}
inline void lnk(RG int x,RG int y){
to[++cnt]=y,nxt[cnt]=head[x],head[x]=cnt;
to[++cnt]=x,nxt[cnt]=head[y],head[y]=cnt;
}
int main(){
scanf("%d%d",&n,&q);
for(RG int i=1;i<=n;i++) scanf("%d%d",&w[i],&c[i]);
for(RG int i=1;i<n;i++){
int x,y;scanf("%d%d",&x,&y);
lnk(x,y);
}
dfs1(1,0);dfs2(1,1);
for(RG int i=1;i<=n;i++) insert(root[c[i]],dfn[i],w[i],1,n);
for(RG int i=1;i<=q;i++){
scanf("%s",ch+1);
if(ch[1]=='C'){
int x;scanf("%d",&x);
if(ch[2]=='C'){
insert(root[c[x]],dfn[x],0,1,n);
scanf("%d",&c[x]);
insert(root[c[x]],dfn[x],w[x],1,n);
}
if(ch[2]=='W'){
scanf("%d",&w[x]);
insert(root[c[x]],dfn[x],w[x],1,n);
}
}
if(ch[1]=='Q'){
int x,y;scanf("%d%d",&x,&y);
SUM=MAX=0;lca(x,y);
if(ch[2]=='S') printf("%d\n",SUM);
if(ch[2]=='M') printf("%d\n",MAX);
}
}
}

  

bzoj 3531: [Sdoi2014]旅行的更多相关文章

  1. BZOJ 3531: [Sdoi2014]旅行 [树链剖分]

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1685  Solved: 751[Submit][Status] ...

  2. bzoj 3531 [Sdoi2014]旅行(树链剖分,线段树)

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 876  Solved: 446[Submit][Status][ ...

  3. bzoj 3531 [Sdoi2014]旅行 (树剖+线段树 动态开点)

    3531: [Sdoi2014]旅行 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 2984  Solved: 1312[Submit][Status ...

  4. [BZOJ 3531] [Sdoi2014] 旅行 【离线+LCT】

    题目链接:BZOJ - 3531 题目分析 题目询问一条路径上的信息时,每次询问有某种特定的文化的点. 每个点的文化就相当于一种颜色,每次询问一条路径上某种颜色的点的信息. 可以使用离线算法, 类似于 ...

  5. BZOJ 3531 [Sdoi2014]旅行 树链剖分+动态开点线段树

    题意 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. 为了方便,我们用 ...

  6. [bzoj 3531][SDOI2014]旅行(树链剖分+动态开点线段树)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3531 分析: 对于每个颜色(颜色<=10^5)都建立一颗线段树 什么!那么不是M ...

  7. 【刷题】BZOJ 3531 [Sdoi2014]旅行

    Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰 ...

  8. BZOJ 3531 SDOI2014 旅行 树链剖分+线段树动态开点

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3531 题意概述: 给出一棵N个点的树,树上的每个结点有一个颜色和权值,支持以下四种操作: ...

  9. BZOJ 3531: [Sdoi2014]旅行 权值线段树 + 树链剖分

    Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰 ...

随机推荐

  1. 关于apidoc文档生成不了的一个原因

    前几天在写完API后,写注释文档,然后很习惯的去用apidoc取生成注释文档,但是奇怪的事发生了,没有注释的内容,也没有报错:注释代码如下: /* * @api {get} /applet/:id 根 ...

  2. Less的Mixin

    什么是Mixin Less中,允许你将一个类嵌入到另一个类中,被嵌入的类也可以看作变量.换句话说,你可以用一个类定义样式,然后把它当作变量,在另一个类中,只要引用变量的名字,就能使用它的所有属性, L ...

  3. python实战--数据结构二叉树

    此文将讲述如何用python实战解决二叉树实验 前面已经讲述了python语言的基本用法,现在让我们实战一下具体明确python的用法 点击我进入python速成笔记 先看一下最终效果图: 首先我们要 ...

  4. 一个for循环打印二维数组

    #include<stdio.h> #define MAXX 2 #define MAXY 3 void printarray() { ,,,,,}; ;i< MAXX*MAXY;i ...

  5. Mysql实现企业级日志管理、备份与恢复实战

    背景 随着业务的发展,公司业务和规模不断扩大,网站积累了大量的用户信息和数据,对于一家互联网公司来说,用户和业务数据是根基.一旦公司的数据错乱或者丢失,对于互联网公司而言就等于说是灭顶之灾,为防止系统 ...

  6. Nodejs学习笔记(十七)--- 浮点运算decimal.js

    目录 前言 JavaScript加减乘除运算 decimal.js加减乘除运算 前言 开发过程中免不了有浮点运算,JavaScript浮点运算的精度问题会带来一些困扰 JavaScript 只有一种数 ...

  7. QScintilla 编译

    直接上英文了,不翻译了.看不懂的可以留言哈. ———————————————————————————————————————— Installation As supplied QScintilla ...

  8. POJ 2631 Roads in the North(树的直径)

    POJ 2631 Roads in the North(树的直径) http://poj.org/problem? id=2631 题意: 有一个树结构, 给你树的全部边(u,v,cost), 表示u ...

  9. Java集合源代码剖析(二)【HashMap、Hashtable】

    HashMap源代码剖析 ; // 最大容量(必须是2的幂且小于2的30次方.传入容量过大将被这个值替换) static final int MAXIMUM_CAPACITY = 1 << ...

  10. Woody的Python学习笔记1

    Python 是一种解释性语言:这意味着开发过程中省去了编译这个环节,类似于PHP\Perl. Python 是交互式语言:这意味着你能够在一个python提示符,直接互动运行写你的程序. Pytho ...