[BZOJ 4999]This Problem Is Too Simple!
[BZOJ 4999]This Problem Is Too Simple!
题目
给您一颗树,每个节点有个初始值。现在支持以下两种操作:1. C i x(0<=x<2^31) 表示将i节点的值改为x。2. Q i j x(0<=x<2^31) 表示询问i节点到j节点的路径上有多少个值为x的节点。INPUT
第一行有两个整数N,Q(1 ≤N≤ 100,000;1 ≤Q≤ 200,000),分别表示节点个数和操作个数。下面一行N个整数,表示初始时每个节点的初始值。接下来N-1行,每行两个整数x,y,表示x节点与y节点之间有边直接相连(描述一颗树)。接下来Q行,每行表示一个操作,操作的描述已经在题目描述中给出。OUTPUT
对于每个Q输出单独一行表示所求的答案。
SAMPLE
INPUT
5 6
10 20 30 40 50
1 2
1 3
3 4
3 5
Q 2 3 40
C 1 40
Q 2 3 40
Q 4 5 30
C 3 10
Q 4 5 30OUTPUT
0
1
1
0
解题报告
树剖+权值线段树动态开点+离散
随便搞搞就行了
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
inline int read(){
int sum();
char ch(getchar());
for(;ch<''||ch>'';ch=getchar());
for(;ch>=''&&ch<='';sum=sum*+(ch^),ch=getchar());
return sum;
}
struct edge{
int e;
edge *n;
}ed[],*pre[];
int tot;
inline void insert(int s,int e){
ed[++tot].e=e;
ed[tot].n=pre[s];
pre[s]=&ed[tot];
}
map<int,int>ma;
int num;
int n,q;
int a[];
int dep[],size[],fa[],son[];
inline void dfs1(int u){
size[u]=;
son[u]=;
for(edge *i=pre[u];i;i=i->n){
int e(i->e);
if(e!=fa[u]){
fa[e]=u;
dep[e]=dep[u]+;
dfs1(e);
size[u]+=size[e];
if(size[e]>size[son[u]])
son[u]=e;
}
}
}
int timee;
int id[],pos[],top[];
inline void dfs2(int u,int rt){
top[u]=rt;
id[u]=++timee;
pos[timee]=u;
if(son[u])
dfs2(son[u],rt);
for(edge *i=pre[u];i;i=i->n){
int e(i->e);
if(e!=fa[u]&&e!=son[u])
dfs2(e,e);
}
}
int cnt;
int rt[],lch[],rch[],sum[];
inline void update(int &x,int pos,int w,int l,int r){
if(!x)
x=++cnt;
sum[x]+=w;
if(l==r)
return;
int mid((l+r)>>);
if(pos<=mid)
update(lch[x],pos,w,l,mid);
else
update(rch[x],pos,w,mid+,r);
}
inline int query(int x,int ll,int rr,int l,int r){
if(!x)
return ;
if(ll<=l&&r<=rr)
return sum[x];
int mid((l+r)>>),ret();
if(ll<=mid)
ret+=query(lch[x],ll,rr,l,mid);
if(mid<rr)
ret+=query(rch[x],ll,rr,mid+,r);
return ret;
}
inline int ask(int x,int y,int z){
int ret(),tmp(ma[z]);
while(top[x]^top[y]){
if(dep[top[x]]<dep[top[y]])
swap(x,y);
ret+=query(rt[tmp],id[top[x]],id[x],,n);
x=fa[top[x]];
}
if(dep[x]>dep[y])
swap(x,y);
ret+=query(rt[tmp],id[x],id[y],,n);
return ret;
}
char op[];
int main(){
memset(pre,NULL,sizeof(pre));
n=read(),q=read();
for(int i=;i<=n;++i)
a[i]=read();
for(int i=;i<n;++i){
int x(read()),y(read());
insert(x,y),insert(y,x);
}
dfs1();
dfs2(,);
for(int i=;i<=n;++i){
if(!ma[a[i]])
ma[a[i]]=++num;
update(rt[ma[a[i]]],id[i],,,n);
}
while(q--){
scanf("%s",op);
if(op[]=='C'){
int x(read()),y(read());
update(rt[ma[a[x]]],id[x],-,,n);
if(!ma[y])
ma[y]=++num;
a[x]=y;
update(rt[ma[y]],id[x],,,n);
}
else{
int x(read()),y(read()),z(read());
if(!ma[z])
puts("");
else
printf("%d\n",ask(x,y,z));
}
}
}
[BZOJ 4999]This Problem Is Too Simple!的更多相关文章
- bzoj 4999: This Problem Is Too Simple!
Description 给您一颗树,每个节点有个初始值. 现在支持以下两种操作: 1. C i x(0<=x<2^31) 表示将i节点的值改为x. 2. Q i j x(0<=x&l ...
- BZOJ 4999: This Problem Is Too Simple! DFS序+LCA+树状数组+离线
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) , ...
- 4999: This Problem Is Too Simple!
Description 给您一颗树,每个节点有个初始值. 现在支持以下两种操作: C i x(0<=x<2^31) 表示将i节点的值改为x. Q i j x(0<=x<2^31 ...
- 【BZOJ4999】This Problem Is Too Simple!(线段树)
[BZOJ4999]This Problem Is Too Simple!(线段树) 题面 BZOJ 题解 对于每个值,维护一棵线段树就好啦 动态开点,否则空间开不下 剩下的就是很简单的问题啦 当然了 ...
- 【BZOJ4999】This Problem Is Too Simple! 离线+树状数组+LCA
[BZOJ4999]This Problem Is Too Simple! Description 给您一颗树,每个节点有个初始值. 现在支持以下两种操作: 1. C i x(0<=x<2 ...
- 【BZOJ】【3489】A simple rmq problem
KD-Tree(乱搞) Orz zyf教给蒟蒻做法 蒟蒻并不会这题正解……(可持久化树套树?...Orz 对于每个点,我们可以求出pre[i],nex[i],那么询问的答案就是:求max (a[i]) ...
- Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ...
- bzoj 2301: [HAOI2011]Problem b
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Submit: 3757 Solved: 1671 [Submit] ...
- BZOJ 2298: [HAOI2011]problem a 动态规划
2298: [HAOI2011]problem a Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnli ...
随机推荐
- residual sum of squares(ESL 读书笔记)
The learning algorithm has the property that it can modify its input/output relationship f-hat in re ...
- ref 和out的区别
在C#语言中,参数的传递有两种,一种是值传递,一种是引用传递.ref与out这两种方式都属于引用传递,只是他们的用法稍有不同.下面看几个例子 使用ref的例子 class test { static ...
- MyEclipse个性设置
MyEclipse个性设置 (1)Myeclipse 打开 jsp 的默认编辑器不好,会同时打开预览.所以做如下更改 Windows–>Perferences–>General–>E ...
- 一、Linux文件权限与目录配置
行文结构如下: 用户和用户组 Linux文件权限概念 Linux目录配置 重点回顾 1.用户与用户组 Linux是个多用户.多任务的系统,可能有多人同时使用这台机器进行工作,为了考虑每个人的隐私和工作 ...
- 路一直都在——That's just life
分享一首很喜欢的歌,有时候歌词写得就是经历,就是人生... 穿过人潮汹涌灯火栏栅 没有想过回头 一段又一段走不完的旅程 什么时候能走完 我的梦代表什么 又是什么让我们不安 That's just li ...
- vue实现全选,反选
1.example.vue <template> <table class="table-common"> <tr> <th class= ...
- Netty(1) - 理解
官网:netty.io ---------------------------------------------------------------------------------------- ...
- JavaScript--String 字符串对象属性
访问字符串对象的属性length: stringObject.length; 返回该字符串的长度. var mystr="Hello World!"; var myl=mystr. ...
- BZOJ 2001 线段树+LCT (TLE)
同是O(nlog^2n)怎么常数差距就这么大呢,,, 同是LCT 怎么我的和Po姐姐的常数差距就这么大呢 我绝对是脑子被驴踢了才写这个垃圾算法 //By SiriusRen #include < ...
- 【Vijos1083/BZOJ1756】小白逛公园(线段树)
[写在前面]TYC (Little White) 真是太巨啦! 题目: Vijos1083 分析: 一眼看上去就是线段树啊-- 然而当我这种蒟蒻兴高采烈地把线段树模板敲了一半,却发现一个问题: 这子区 ...