[日常摸鱼]bzoj1036 [ZJOI2008]树的统计Count
听说后天会考x
省选居然还考模板题的么(好吧好像NOI也有考而且也是树剖…)
题意:一棵树,每个点有权值,三种操作:单点修改、求链上最大值、求链上权值和。
直接上模板。
我可能不会写单点修改的线段树了就直接写了个区间修改的用…
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=30005;
const int T=233333;
inline int read()
{
int s=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){s=s*10+c-'0';c=getchar();}
return s*f;
}
struct edge
{
int to,nxt;
}edges[N<<1];
int n,q,cnt,tot;
int head[N<<1],trs[N<<2],trm[N<<2],lazy[N<<2],top[N],w[N],rk[N],fa[N],size[N],dep[N],son[N],idx[N];
char s[20]; inline void addEdge(int u,int v)
{
edges[++cnt]=(edge){v,head[u]};
head[u]=cnt;
} #define lson (node<<1)
#define rson (node<<1|1) inline void push_up(int node)
{
trs[node]=trs[lson]+trs[rson];
trm[node]=max(trm[lson],trm[rson]);
}
inline void push_down(int node,int l,int r)
{
if(lazy[node]==T)return;
int mid=(l+r)>>1;
trs[lson]=(mid-l+1)*lazy[node];trs[rson]=(r-mid)*lazy[node];trm[lson]=trm[rson]=lazy[node];
lazy[lson]=lazy[rson]=lazy[node];
lazy[node]=T;
}
inline void build(int node,int l,int r)
{
lazy[node]=T;
if(l==r)
{
trs[node]=trm[node]=w[rk[l]];
return ;
}
int mid=(l+r)>>1;
build(lson,l,mid);build(rson,mid+1,r);
push_up(node);
}
inline void modify(int node,int l,int r,int ql,int qr,int val)
{
if(ql<=l&&r<=qr)
{
lazy[node]=val;
trs[node]=(r-l+1)*val;
trm[node]=val;
return;
}
push_down(node,l,r);int mid=(l+r)>>1;
if(mid>=ql)modify(lson,l,mid,ql,qr,val);
if(mid+1<=qr)modify(rson,mid+1,r,ql,qr,val);
push_up(node);
}
inline int query_max(int node,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)return trm[node];
push_down(node,l,r);int mid=(l+r)>>1,res=-T;
if(mid>=ql)res=max(res,query_max(lson,l,mid,ql,qr));
if(mid+1<=qr)res=max(res,query_max(rson,mid+1,r,ql,qr));
return res;
}
inline int query_sum(int node,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)return trs[node];
push_down(node,l,r);int mid=(l+r)>>1,res=0;
if(mid>=ql)res+=query_sum(lson,l,mid,ql,qr);
if(mid+1<=qr)res+=query_sum(rson,mid+1,r,ql,qr);
return res;
} #undef lson
#undef rson #define cur edges[i].to
inline void dfs1(int x)
{
size[x]=1;
for(register int i=head[x];i;i=edges[i].nxt)
if(cur!=fa[x])
{
fa[cur]=x;dep[cur]=dep[x]+1;
dfs1(cur);size[x]+=size[cur];
if(size[son[x]]<size[cur])son[x]=cur;
}
}
inline void dfs2(int x,int t)
{
idx[x]=++tot;top[x]=t;rk[tot]=x;
if(son[x])dfs2(son[x],t);
for(register int i=head[x];i;i=edges[i].nxt)
if(cur!=fa[x]&&cur!=son[x])dfs2(cur,cur);
}
#undef cur inline int link_max(int a,int b)
{
int res=-T;
while(top[a]!=top[b])
{
if(dep[top[a]]<dep[top[b]])swap(a,b);
res=max(res,query_max(1,1,n,idx[top[a]],idx[a]));
a=fa[top[a]];
}
if(dep[a]>dep[b])swap(a,b);
res=max(res,query_max(1,1,n,idx[a],idx[b]));
return res;
}
inline int link_sum(int a,int b)
{
int res=0;
while(top[a]!=top[b])
{
if(dep[top[a]]<dep[top[b]])swap(a,b);
res+=query_sum(1,1,n,idx[top[a]],idx[a]);
a=fa[top[a]];
}
if(dep[a]>dep[b])swap(a,b);
res+=query_sum(1,1,n,idx[a],idx[b]);
return res;
}
int main()
{
n=read();
for(register int i=1;i<n;i++)
{
int u,v;u=read();v=read();
addEdge(u,v);addEdge(v,u);
}
for(register int i=1;i<=n;i++)w[i]=read();
dfs1(1);dfs2(1,1);build(1,1,n);
q=read();
for(register int i=1;i<=q;i++)
{
scanf("%s",s+1);
if(s[1]=='C')
{
int u,t;u=read();t=read();
modify(1,1,n,idx[u],idx[u],t);
}else
{
int u,v;u=read();v=read();
if(s[2]=='M')
printf("%d\n",link_max(u,v));
else
printf("%d\n",link_sum(u,v));
}
}
}
[日常摸鱼]bzoj1036 [ZJOI2008]树的统计Count的更多相关文章
- [BZOJ1036][ZJOI2008]树的统计Count 解题报告|树链剖分
树链剖分 简单来说就是数据结构在树上的应用.常用的为线段树splay等.(可现在splay还不会敲囧) 重链剖分: 将树上的边分成轻链和重链. 重边为每个节点到它子树最大的儿子的边,其余为轻边. 设( ...
- bzoj1036 [ZJOI2008]树的统计Count
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MB Submit: 12646 Solved: 5085 [Subm ...
- bzoj1036 [ZJOI2008]树的统计Count 树链剖分模板题
[ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u ...
- bzoj千题计划124:bzoj1036: [ZJOI2008]树的统计Count
http://www.lydsy.com/JudgeOnline/problem.php?id=1036 树链剖分板子题 #include<cstdio> #include<iost ...
- BZOJ1036 [ZJOI2008]树的统计Count 树链剖分
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1036 题意概括 一个树,每个节点有一个权值.3种操作. 1:修改某一个节点的权值. 2:询问某两个 ...
- 【lct】bzoj1036 [ZJOI2008]树的统计Count
题意:给你一棵树,点带权,支持三种操作:单点修改:询问链上和:询问链上max. 这里的Query操作用了与上一题不太一样的做法(上一题用那种做法,因为在边带权的情况下换根太困难啦): 先ChangeR ...
- BZOJ1036[ZJOI2008]树的统计Count 题解
题目大意: 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.有一些操作:1.把结点u的权值改为t:2.询问从点u到点v的路径上的节点的最大权值 3.询问从点u到点v的路径上的节点的权值和 ...
- bzoj1036 zjoi2008 树的统计 count
填坑= =第一道裸树剖 #include<cstdio> #include<algorithm> #include<cstring> #include<cst ...
- [BZOJ1036] [ZJOI2008] 树的统计Count (LCT)
Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. Q ...
随机推荐
- 又陷入知识盲区了,面试被问SpringBoot集成dubbo,我当时就懵了
前言 前两天在和粉丝聊天的时候,粉丝跟我说之前在面试的时候被问到SpringBoot这一块的知识被问的有点懵,和我问了不少这方面的东西.事后我想了想不如把这些东西分享出来吧,让更多的人看到,这样不管是 ...
- 「CERC2017」Donut Drone
题目链接 洛谷P4739 题目翻译: 你正在模拟无人机探索一个不稳定的环状行星的过程.技术上说,无人机正在穿过一个环形网格---一个在两维上都首尾环绕在一起的矩形网格.格子的行号从上到下依次编号为\( ...
- 宝塔Linux面板安装
宝塔linux6.0版本是基于centos7开发的,务必使用centos7.x 系统 提示:Centos官方已宣布在2020年停止对Centos6的维护更新,各大软件开发商也逐渐停止对Centos6的 ...
- Goland 2020.2.x 激活码永久破解教程 (最新Goland激活码!2020.11.26亲测可用!)
在2020.11.26 Goland的用户们又迎来了一次更新,这就导致很多软件打开时候就提示Goland激活码已经失效,码小辫第一时间给各位分享了关于最新Goland激活破解教程! goland已经更 ...
- mysql hash join
面阿里问到的. "mysql join的实现有几种方式?" "啥?不就一种吗?" 转载: 简单介绍:https://zhuanlan.zhihu.com/p/9 ...
- redis 压测与乐观锁
单线程没有出现并发问题. 链接太多爆炸了 把连接改到50,没有问题 改回1000: emmm159,看来相当一部分拒绝了 并且8180-10000到头了 cpu爆炸了 观察下这种程度的并发用乐观锁 一 ...
- Beta——代码规范与计划
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 团队进行Beta冲刺 作业正文 正文 其他参考文献 无 代码规范 此次代码规 ...
- Centos7安装Kubernetes k8s v1.16.0 国内环境
一. 为什么是k8s v1.16.0? 最新版的v1.16.2试过了,一直无法安装完成,安装到kubeadm init那一步执行后,报了很多错,如:node xxx not found等.centos ...
- badboy下载
最近新接触了badboy软件,以下是百度网盘链接,有需要可以下载. 链接:https://pan.baidu.com/s/1O4oIhx-twcaMA_fDzRQPHg提取码:7i44 二维码:
- nginx反向代理docker容器化django
1.新建Dockerfile FROM python:3.8.5 MAINTAINER ChsterChen ENV PYTHONUNBUFFERED 1 COPY pip.conf /root/.p ...