[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 30

OUTPUT

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!的更多相关文章

  1. 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 ...

  2. BZOJ 4999: This Problem Is Too Simple! DFS序+LCA+树状数组+离线

    Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) , ...

  3. 4999: This Problem Is Too Simple!

    Description 给您一颗树,每个节点有个初始值. 现在支持以下两种操作: C i x(0<=x<2^31) 表示将i节点的值改为x. Q i j x(0<=x<2^31 ...

  4. 【BZOJ4999】This Problem Is Too Simple!(线段树)

    [BZOJ4999]This Problem Is Too Simple!(线段树) 题面 BZOJ 题解 对于每个值,维护一棵线段树就好啦 动态开点,否则空间开不下 剩下的就是很简单的问题啦 当然了 ...

  5. 【BZOJ4999】This Problem Is Too Simple! 离线+树状数组+LCA

    [BZOJ4999]This Problem Is Too Simple! Description 给您一颗树,每个节点有个初始值. 现在支持以下两种操作: 1. C i x(0<=x<2 ...

  6. 【BZOJ】【3489】A simple rmq problem

    KD-Tree(乱搞) Orz zyf教给蒟蒻做法 蒟蒻并不会这题正解……(可持久化树套树?...Orz 对于每个点,我们可以求出pre[i],nex[i],那么询问的答案就是:求max (a[i]) ...

  7. Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ...

  8. bzoj 2301: [HAOI2011]Problem b

    2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Submit: 3757 Solved: 1671 [Submit] ...

  9. BZOJ 2298: [HAOI2011]problem a 动态规划

    2298: [HAOI2011]problem a Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnli ...

随机推荐

  1. B4197 [Noi2015]寿司晚宴 状压dp

    这个题一开始想到了唯一分解定理,然后状压.但是显然数组开不下,后来想到每个数(n<500)大于19的素因子只可能有一个,所以直接单独存就行了. 然后正常状压dp就很好搞了. 题干: Descri ...

  2. JZOJ 1667 ( bzoj 1801 ) [ AHOI 2009 ] 中国象棋 —— DP

    题目:https://jzoj.net/senior/#main/show/1667 首先,一行.一列最多只有 2 个炮: 所以记录一下之前有多少行有 0/1/2 个炮,转移即可: 注意取模!小心在某 ...

  3. html5拨打电话及发短信

    1.最常用WEB页面一键拨号的电话拨打功能 <a href="tel:15088888888">拨号</a> 2.最常用WEB页面一键发送短信功能: < ...

  4. 作业训练------通过读取c.txt文件中的内容等号右值,并将右值的最大值、最小值、平均值打印到屏幕上。

    这篇博客是学习传智播客c++教程的作业,通过在网上进行搜集来完成,但是网上有相似的代码,但是结果总是有点问题,所以本文写了这篇记录下. #include <stdio.h> #includ ...

  5. PCB 使用第3方网站做为外链图片资源

    计划将Web版SI9000阻抗计算工具放外网了,由于个人网站带宽太小原因, 准备将静态的图片资源放在第三方网站,今天找了好几个图床网站,把阻抗模型图上传到图床网站,这样一来就能解决带宽的问题了,今天折 ...

  6. 微信小程序之商品发布+编辑功能(多图片上传功能)

    小程序的商品发布页面:功能有多图片上传 遇到的问题记录一下:1.uploadFile成功之后返回的参数是json字符串,一定要用JSON.parse转换为object格式 2.因为商品发布和编辑都是在 ...

  7. IOC框架---什么是IOC

    1 IoC理论的背景    我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑.                    ...

  8. scala控制流程语句

    直接上代码了哈. package com.test.scala.test object Kongzi { def main(args: Array[String]): Unit = { //if 语句 ...

  9. RESTful 设计理论

    RESTful 设计: 1.协议通信协议:https 2.域名部署在API专用域名下,除非API很简单(https://www.example.com/api)https://api.example. ...

  10. js基础---object对象

    //**********************************复杂JSON举例**************************************** var Jsondata={d ...