当前位置 : 主页 > 网络编程 > 其它编程 >

【GDOI模拟】数树数

来源:互联网 收集:自由互联 发布时间:2023-07-02
Description给定一棵N个节点的树,标号从1~N。每个点有一个权值。要求维护两种操作:1.Cix(0x2^31)表示将i点权值变为x2.Q Description 给定一棵N 个节点的树,标号从1~N。每个点有一个权值。要
Description给定一棵N个节点的树,标号从1~N。每个点有一个权值。要求维护两种操作:1.Cix(0x2^31)表示将i点权值变为x2.Q

Description

给定一棵N 个节点的树,标号从1~N。每个点有一个权值。要求维护两种操作: 1. C i x(0<=x<2^31) 表示将i 点权值变为x 2. Q i j x(0<=x<2^31) 表示询问i 到j 的路径上有多少个值为x 的节点

Solution

这是一道很裸的树链剖分的题目,有一道题很这题极其类似【SDOI2014】旅行 不过多了一些操作而已。

用动态开空间的方法

这种方法又快又好大,没有什么麻烦的操作,全是些基础。

要打个离散化加hash

我是一个c++选手,一个map就搞定了。

注意

root有可能会爆掉,这个坑了我10分,TAT

在线大法好!

Code

#include#include#include#include#include#include#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;const int maxn=100007;int i,j,k,l,n,m,ans;int first[maxn*2],next[maxn*2],last[maxn*2],num,tot;int size[maxn],fa[maxn],deep[maxn],son[maxn],w[maxn],sum;int root[maxn*6],top[maxn],tt,e[maxn],ppo,b[maxn];bool bz[maxn];map f;char s[5];struct nod{ int a,b,c;}a[maxn];struct node{ int l,r,sum;}t[maxn*200]; void add(int x,int y){ last[++num]=y; next[num]=first[x]; first[x]=num; last[++num]=x; next[num]=first[y]; first[y]=num;}void dfs1(int x,int y){ int i,k=0; size[x]=1; for(i=first[x];i;i=next[i]){ if(last[i]!=y){ fa[last[i]]=x; deep[last[i]]=deep[x]+1; dfs1(last[i],x); size[x]+=size[last[i]]; if(k
网友评论