6977 树的统计

经验值:3200

时间限制:1000毫秒

内存限制:512MB

题目描述 Description

一树上有 nn 个节点,编号分别为 11 到 nn,每个节点都有一个权值 ww。我们将以下面的形式来要求你对这棵树完成一些操作:

  1. CHANGE u t :把节点 uu 权值改为 tt;
  2. QMAX u v :询问点 uu 到点 vv 路径上的节点的最大权值;
  3. QSUM u v :询问点 uu 到点 vv 路径上的节点的权值和。

注意:从点 uu 到点 vv 路径上的节点包括 uu 和 vv 本身。

输入描述 Input Description

第一行为一个数 nn,表示节点个数;

接下来 n−1n−1 行,每行两个整数 a,ba,b,表示节点 aa 与节点 bb 之间有一条边相连;

接下来 nn 行,每行一个整数,第 ii 行的整数 wiwi​ 表示节点 ii 的权值;

接下来一行,为一个整数 qq ,表示操作总数;

接下来 qq 行,每行一个操作,以 CHANGE u t 或 QMAX u v 或 QSUM u v的形式给出。

输出描述 Output Description

对于每个 QMAX 或 QSUM 的操作,每行输出一个整数表示要求的结果。

样例输入 Sample Input

4 1 2 2 3 4 1 4 2 1 3 12 QMAX 3 4 QMAX 3 3 QMAX 3 2 QMAX 2 3 QSUM 3 4 QSUM 2 1 CHANGE 1 5 QMAX 3 4 CHANGE 3 6 QMAX 3 4 QMAX 2 4 QSUM 3 4

样例输出 Sample Output

4 1 2 2 10 6 5 6 5 16

数据范围及提示 Data Size & Hint

对于 100%100% 的数据,有 1≤n≤3×104,0≤q≤2×1051≤n≤3×104,0≤q≤2×105。中途操作中保证每个节点的权值 ww 在 −30000−30000 至 3000030000 之间。

代码

这个,经典水题,思路:

这个题目可以使用树状数组来解决。

首先建立一个树状数组,用于存储每个节点的权值。

然后遍历树的每个节点,将节点的权值加入到树状数组中。

接下来处理操作,对于CHANGE操作,直接更新节点的权值即可。

对于QMAX操作,可以通过查询树状数组的前缀最大值来实现。找到节点u和节点v的最近公共祖先,然后分别查询节点u到最近公共祖先的路径上的最大值,和节点v到最近公共祖先的路径上的最大值,取最大值即为所求。

对于QSUM操作,可以通过查询树状数组的前缀和来实现。同样找到节点u和节点v的最近公共祖先,然后分别查询节点u到最近公共祖先的路径上的和,和节点v到最近公共祖先的路径上的和,然后将两者相加即为所求。

时间复杂度分析:建立树状数组的时间复杂度为O(nlogn),处理操作的时间复杂度为O(qlogn),总时间复杂度为O(nlogn+qlogn)。由于n和q的最大值为3×10^4和2×10^5,所以算法可以承受。

我喜欢最后附代码

等一下……啊!

保持镇定,分号没加

这才是帅气的作者应有的样子

#include<bits/stdc++.h>
using namespace std;
const int MAXN=100005;
int first[MAXN],nxt[MAXN],to[MAXN],topp=0;
int sum[MAXN*4],maxx[MAXN*4],num[MAXN];
int son[MAXN],father[MAXN],top[MAXN],siz[MAXN],id[MAXN],rk[MAXN],pos=0,dep[MAXN];
int n,m;
void add(int u,int v)
{topp++;nxt[topp]=first[u];first[u]=topp;to[topp]=v;topp++;nxt[topp]=first[v];first[v]=topp;to[topp]=u;
}
void dfs(int x,int deep)//搞好重链
{dep[x]=deep;siz[x]=1;int tmp=0;for(int i=first[x];~i;i=nxt[i]){int v=to[i];if(father[x]==v) continue;father[v]=x;dfs(v,deep+1);siz[x]+=siz[v];if(siz[v]>tmp) son[x]=v,tmp=siz[v];}return ;
}
void dfs2(int x,int nowtop)//id节点所对应后的编号 rk序列所对应的数字  top
{top[x]=nowtop;pos++;id[x]=pos;rk[pos]=x;if(!son[x]) return;dfs2(son[x],nowtop);for(int i=first[x];~i;i=nxt[i]){int v=to[i];if(v==father[x]||v==son[x]){continue;}dfs2(v,v);}return ;
}
void build(int root,int l,int r)
{
//    cout<<l<<" "<<r<<endl;if(l==r){maxx[root]=num[rk[l]];sum[root]=num[rk[l]];//cout<<maxx[root]<<" "<<sum[root]<<num[r<<endl;return ;}int mid=(l+r)/2;build(root*2,l,mid);build(root*2+1,mid+1,r);maxx[root]=max(maxx[root*2],maxx[root*2+1]);sum[root]=sum[root*2]+sum[root*2+1];
//    cout<<maxx[root]<<" "<<sum[root]<<endl;return ;
}
void updata(int root,int l,int r,int x,int num)
{
//    cout<<l<<" "<<r<<endl;if(l==r&&r==x){maxx[root]=num;sum[root]=num;return;}int mid=(l+r)/2;if(x<=mid){updata(root*2,l,mid,x,num);}else{updata(root*2+1,mid+1,r,x,num);}maxx[root]=max(maxx[root*2],maxx[root*2+1]);sum[root]=sum[root*2]+sum[root*2+1];
}
int qqmax(int root,int ll,int rr,int l,int r)
{if(ll<=l&&rr>=r){return maxx[root];}int mid=(l+r)/2;if(rr<=mid) return qqmax(root*2,ll,rr,l,mid);else if(ll>mid) return qqmax(root*2+1,ll,rr,mid+1,r);else return max(qqmax(root*2,ll,rr,l,mid),qqmax(root*2+1,ll,rr,mid+1,r));
}
int qqsum(int root,int ll,int rr,int l,int r)
{if(ll<=l&&rr>=r){return sum[root];}int mid=(l+r)/2;if(rr<=mid) return qqsum(root*2,ll,rr,l,mid);else if(ll>mid) return qqsum(root*2+1,ll,rr,mid+1,r);else return qqsum(root*2,ll,rr,l,mid)+qqsum(root*2+1,ll,rr,mid+1,r);
}
int qmax(int x,int y)
{int ans=-1e9;while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]){ans=max(ans,qqmax(1,id[top[y]],id[y],1,n));y=father[top[y]];}else{ans=max(ans,qqmax(1,id[top[x]],id[x],1,n));x=father[top[x]];}}
//    cout<<"x"<<endl;if(x==y){ans=max(ans,num[x]);}if(dep[x]<dep[y]){ans=max(ans,qqmax(1,id[x],id[y],1,n));}if(dep[x]>dep[y]){ans=max(ans,qqmax(1,id[y],id[x],1,n));}return ans;
}
int qsum(int x,int y)
{int ans=0;while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]){ans+=qqsum(1,id[top[y]],id[y],1,n);y=father[top[y]];}else{ans+=qqsum(1,id[top[x]],id[x],1,n);x=father[top[x]];}}if(x==y){ans+=num[x];}if(dep[x]<dep[y]){ans+=qqsum(1,id[x],id[y],1,n);}if(dep[x]>dep[y]){ans+=qqsum(1,id[y],id[x],1,n);}return ans;
}
int main()
{father[1]=1;memset(first,-1,sizeof(first));scanf("%d",&n);for(int i=1;i<n;i++){int tmp1,tmp2;scanf("%d%d",&tmp1,&tmp2);add(tmp1,tmp2);}for(int i=1;i<=n;i++){scanf("%d",&num[i]);}dfs(1,1);dfs2(1,1);build(1,1,n);
//    cout<<qqsum(1,1,4,1,4);scanf("%d",&m);while(m--){char op[20];scanf("%s",op);int tmp1,tmp2;scanf("%d%d",&tmp1,&tmp2);if(op[1]=='H')//更新节点{num[tmp1]=tmp2;updata(1,1,n,id[tmp1],tmp2);}if(op[1]=='M')//最大值{printf("%d\n",qmax(tmp1,tmp2));}if(op[1]=='S')//求和{printf("%d\n",qsum(tmp1,tmp2));}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/460462.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL之排名RANK()、ROW_NUMBER()、DENSE_RANK() 和 NTILE() 的区别(SQL 和 Hive SQL 都支持)

现有一张student 表,表中包含id、uname、age、score 四个字段,如下所示: 该表的数据如下所示: 一、ROW_NUMBER() 1、概念 ROW_NUMBER() 为结果集中的每一行分配一个唯一的连续整数,编号从 1 开始。‌ 该函数按照指定的顺序进行排序,即使存在相同的值,每一行也会获得…

机器人转人工时,开启实时质检(mod_cti基于FreeSWITCH)

文章目录 前言联系我们实现步骤1. 修改拨号方案2. 启用拨号方案 前言 在客户与机器人对话中&#xff0c;是不能开启质检功能的。因为机器人识别会与质检识别产生冲突。如果用户想通过机器人转接到人工时&#xff0c;开启质检功能&#xff0c;记录客户与人工之间的对话。应该如…

结合Intel RealSense深度相机和OpenCV来实现语义SLAM系统

结合Intel RealSense深度相机和OpenCV来实现语义SLAM系统是一个非常强大的组合。以下是一个详细的步骤指南&#xff0c;帮助你构建这样一个系统。 硬件准备 Intel RealSense深度相机&#xff1a;例如D415、D435或L515。计算平台&#xff1a;一台具有足够计算能力的计算机&…

【JVM 深入了解】JVM 到底包含什么?

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

炫酷的登录框!(附源码)

大家想看什么前端效果请留言 预览效果 源码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>登录页…

MYSQL-SQL-03-DQL(Data Query Language,数据查询语言)(单表查询)

DQL&#xff08;数据查询语言&#xff09; DQL英文全称是Data Query Language(数据查询语言)&#xff0c;数据查询语言&#xff0c;用来查询数据库中表的记录。 查询关键字: SELECT 在一个正常的业务系统中&#xff0c;查询操作的频次是要远高于增删改的&#xff0c;当我们去访…

从理解路由到实现一套Router(路由)

小伙伴们大家好啊&#xff0c;我是李牌牌。平时在Vue项目中经常用到路由&#xff0c;但是也仅仅处于会用的层面&#xff0c;很多基础知识并不是真正的理解。于是牌牌呢查阅了很多资料&#xff0c;总结下路由相关的知识&#xff0c;查缺不漏&#xff0c;加深自己对路由的理解。 …

MFC图形函数学习04——画矩形函数

MFC中绘制矩形函数是MFC的基本绘图函数&#xff0c;它的大小和位置由左上角和右下角的坐标决定&#xff1b;若想绘制的矩形边框线型、线宽、颜色以及填充颜色都还需要其它函数的配合。 一、绘制矩形函数 原型&#xff1a;BOOL Rectangle(int x1,int y1,int x2,int y2); …

Kafka 与传统 MQ 消息系统之间有三个关键区别?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka 与传统 MQ 消息系统之间有三个关键区别&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; Kafka 与传统 MQ 消息系统之间有三个关键区别&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 …

TLKS-PMG-100BM这款输电线路智能多目视频监控装置,它具体有哪些亮点和优势?

TLKS-PMG-100BM输电线路智能多目视频监控装置&#xff08;输电线路全景视频监控装置、输电线路云台变焦视频监控装置&#xff09;无疑是一款功能全面、性能卓越的输电线路智能监控装置。它配备了水平360、垂直90旋转的全向云台摄像头&#xff0c;能够轻松实现全景视野监视&…

Java中的运算符【与C语言的区别】

目录 1. 算术运算符 1.0 赋值运算符&#xff1a; 1.1 四则运算符&#xff1a; - * / % 【取余与C有点不同】 1.2 增量运算符&#xff1a; - * / % * 【右侧运算结果会自动转换类型】 1.3 自增、自减&#xff1a;、-- 2. 关系运算符 3. 逻辑运算符 3.1 短路求值 3.2 【…

目标检测:YOLOv11(Ultralytics)环境配置,适合0基础纯小白,超详细

目录 1.前言 2. 查看电脑状况 3. 安装所需软件 3.1 Anaconda3安装 3.2 Pycharm安装 4. 安装环境 4.1 安装cuda及cudnn 4.1.1 下载及安装cuda 4.1.2 cudnn安装 4.2 创建虚拟环境 4.3 安装GPU版本 4.3.1 安装pytorch&#xff08;GPU版&#xff09; 4.3.2 安装ultral…

HT7178 带输出关断的20V,14A全集成同步升压转换器

1、特点 输入电压范围VpIN:2.7V-20V 输出电压范围VouT:4.5V-20V 可编程峰值电流:14A 高转换效率: 95%(VPIN7.2V, VoUT 16V, IouT3A) 94%(VPIN12V,VoUT18V,IoUT4A) 90%(VPIN3.3, VoUT-9V,IOUT3A) 轻载条件下两种调制方式:脉频调制(PFM)和 强制脉宽调试(PWM) 集成输出关断的栅极…

使用axios请求分页

npm install axios <template><div><el-table :data"items" style"width: 100%"><el-table-column prop"id" label"ID" /><el-table-column prop"name" label"名称" /><!-- 添…

基于SpringBoot的在线医疗问答平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

codeforces _ 补题

C. Ball in Berland 传送门&#xff1a;Problem - C - Codeforces 题意&#xff1a; 思路&#xff1a;容斥原理 考虑 第 i 对情侣组合 &#xff0c;男生为 a &#xff0c;女生为 b &#xff0c;那么考虑与之匹配的情侣 必须没有 a | b &#xff0c;一共有 k 对情侣&#x…

【Canvas与图标】长方形牛皮纸文件袋图标

【成图】 120*120的图标 大图 小图&#xff1a; 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>长方文件袋图标</title>…

奔走相告! ClickHouse 全新构建了强大的 JSON 数据类型

本文字数&#xff1a;8969&#xff1b;估计阅读时间&#xff1a;23 分钟 作者&#xff1a;Pavel Kruglov 本文在公众号【ClickHouseInc】首发 简介 JSON 已成为现代数据系统中处理半结构化和非结构化数据的首选格式。无论是在日志记录和可观测性 (observability) 应用场景、实…

统信UOS下启动图形界面应用工具manager报错:No protocol specified的解决办法

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、问题情况 达梦提供了丰富的图形界面工具&#xff0c;包括&#xff1a;manager、monitor、dbca等&#xff0c;但在统信操作系统进入终端去启动manager时报错&#xff1a;No protocol specified。 咨询了达…

【CSS3】css开篇基础(6)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…