[CF-EDU]Segment Tree - part 1 - Step 1 - Practice

news2024/11/18 15:43:21

练习名称:ITMO Academy: pilot course » Segment Tree

练习链接:Segment Tree, part 1, Step1, Practice

cf官方的线段树专题练习 

A. Segment Tree for the Sum

单点修改,区间和查询

#include <bits/stdc++.h>
#define lson (u << 1)
#define rson (u << 1 | 1)
using LL = long long;
using namespace std;
const int N = 1e5 + 6;
int a[N];
struct node{
  int l, r;
  LL v;
}tr[N << 2];

void pushup(int u){
  tr[u].v = tr[lson].v + tr[rson].v;
}

void build(int u, int l, int r){
  if(l == r) tr[u] = {l, r, a[l]};
  else{
    tr[u] = {l, r};
    int mid = l + r >> 1;
    build(lson, l, mid), build(rson, mid + 1, r);
    pushup(u);
  }
}

void modify(int u, int x, int d){
  if(tr[u].l == x && x == tr[u].r) tr[u].v = d;
  else{
    int mid = tr[u].l + tr[u].r >> 1;
    if(x <= mid) modify(lson, x, d); 
    else modify(rson, x, d);
    pushup(u);
  }
}

LL query(int u, int l, int r){
  if(tr[u].l >= l && tr[u].r <= r) return tr[u].v;
  else{
    int mid = tr[u].l + tr[u].r >> 1;
    LL ans = 0;
    if(l <= mid) ans = query(lson, l, r);
    if(r > mid) ans += query(rson, l, r);
    return ans;
  }
}

int main(){
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int n, m;
  cin >> n >> m;
  for(int i = 1; i <= n; i++) cin >> a[i];
  build(1, 1, n);
  while(m--){
    int a, b, c;
    cin >> a >> b >> c;
    if(a == 1){
      modify(1, b + 1, c);
    }else{
      cout << query(1, b + 1, c) << "\n";
    }
  }
  return 0;
}

  

B. Segment Tree for the Minimum 

单点修改,区间最小值查询

#include <bits/stdc++.h>
#define lson (u << 1)
#define rson (u << 1 | 1)
using LL = long long;
using namespace std;
const int N = 1e5 + 6;
int a[N];
struct node{
  int l, r;
  LL v;
}tr[N << 2];

void pushup(int u){
  tr[u].v = min(tr[lson].v, tr[rson].v);
}

void build(int u, int l, int r){
  if(l == r) tr[u] = {l, r, a[l]};
  else{
    tr[u] = {l, r};
    int mid = l + r >> 1;
    build(lson, l, mid), build(rson, mid + 1, r);
    pushup(u);
  }
}

void modify(int u, int x, int d){
  if(tr[u].l == x && x == tr[u].r) tr[u].v = d;
  else{
    int mid = tr[u].l + tr[u].r >> 1;
    if(x <= mid) modify(lson, x, d); 
    else modify(rson, x, d);
    pushup(u);
  }
}

LL query(int u, int l, int r){
  if(tr[u].l >= l && tr[u].r <= r) return tr[u].v;
  else{
    int mid = tr[u].l + tr[u].r >> 1;
    LL ans = 0x3f3f3f3f;
    if(l <= mid) ans = min(ans, query(lson, l, r));
    if(r > mid) ans = min(ans, query(rson, l, r));
    return ans;
  }
}

int main(){
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int n, m;
  cin >> n >> m;
  for(int i = 1; i <= n; i++) cin >> a[i];
  build(1, 1, n);
  while(m--){
    int a, b, c;
    cin >> a >> b >> c;
    if(a == 1){
      modify(1, b + 1, c);
    }else{
      cout << query(1, b + 1, c) << "\n";
    }
  }
  return 0;
}

 

C. Number of Minimums on a Segment 

单点修改,区间最小值及最小值数量查询

这里就要多维护一个数量,值得注意的就是根据左右子树的区间最小值,来维护区间最小值个数。

对于父节点的维护:

  • 若左子节点的最小值等于右子节点的最小值,父节点的最小值就是它们,父节点的最小值数量就是左子节点的最小值数量加右子节点的最小值数量
  • 若左子节点的最小值大于右子节点的最小值,父节点的最小值就是右子节点的最小值,父节点的最小值数量就是右子节点的最小值数量
  • 若左子节点的最小值小于右子节点的最小值,父节点的最小值就是左子节点的最小值,父节点的最小值数量就是左子节点的最小值数量

在整个过程中如果遇到区间不在同一节点都要执行上述操作

对于最后查询数据的存储可以使用pair或者结构体,只要是二元组即可。

#include <bits/stdc++.h>
#define lson (u << 1)
#define rson (u << 1 | 1)
using LL = long long;
using namespace std;
typedef pair<int, int> PII;
const int N = 1e5 + 6;
int a[N];
struct node{
  int l, r;
  LL v, cnt;
}tr[N << 2];

void pushup(int u){
  if(tr[lson].v == tr[rson].v){
    tr[u].v = tr[lson].v;
    tr[u].cnt = tr[lson].cnt + tr[rson].cnt;
  }else if(tr[lson].v < tr[rson].v){
    tr[u].v = tr[lson].v;
    tr[u].cnt = tr[lson].cnt;
  }else{
    tr[u].v = tr[rson].v;
    tr[u].cnt = tr[rson].cnt;
  }
}

void build(int u, int l, int r){
  if(l == r) tr[u] = {l, r, a[l], 1};
  else{
    tr[u] = {l, r};
    int mid = tr[u].l + tr[u].r >> 1;
    build(lson, l, mid), build(rson, mid + 1, r);
    pushup(u);
  }
}

void modify(int u, int x, int d){
  if(tr[u].l == x && x == tr[u].r) tr[u].v = d;
  else{
    int mid = tr[u].l + tr[u].r >> 1;
    if(x <= mid) modify(lson, x, d); 
    else modify(rson, x, d);
    pushup(u);
  }
}

PII query(int u, int l, int r){
  if(tr[u].l >= l && tr[u].r <= r) return {tr[u].v, tr[u].cnt};
  int mid = tr[u].l + tr[u].r >> 1;
  PII ans = {0x3f3f3f3f, 0};
  if(l <= mid){
    PII cur = query(lson, l, r);
    if(ans.first > cur.first) ans = cur;
    else if(ans.first == cur.first) ans = {ans.first, ans.second + cur.second};   
  }
  if(r > mid){
    PII cur = query(rson, l, r);
    if(ans.first < cur.first) return ans;
    else if(ans.first > cur.first) ans = cur;
    else ans = {ans.first, ans.second + cur.second};    
  }
  return ans;
}

int main(){
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int n, m;
  cin >> n >> m;
  for(int i = 1; i <= n; i++) cin >> a[i];
  build(1, 1, n);
  while(m--){
    int a, b, c;
    cin >> a >> b >> c;
    if(a == 1){
      modify(1, b + 1, c);
    }else{
      auto ans = query(1, b + 1, c);
      cout << ans.first << " " << ans.second << "\n";
    }
  }
  return 0;
}

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

P1825 [USACO11OPEN]Corn Maze S

题目描述 This past fall, Farmer John took the cows to visit a corn maze. But this wasnt just any corn maze: it featured several gravity-powered teleporter slides, which cause cows to teleport instantly from one point in the maze to another. The slides work…

Docker安装镜像,并运行成为容器

1.Docker作用 一个项目中&#xff0c;部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等&#xff0c;这些服务部署时所需要的函数库、依赖项各不相同&#xff0c;甚至会有冲突。给部署带来了极大的困难。 而Docker确巧妙的解决了这些问题, Docker为了解决依赖的兼容问题的…

关于两种单菌种发酵的豆瓣酱代谢组学方面差异研究

生活离不开柴米油盐酱醋茶&#xff0c;其中酱油是中国传统的调味品&#xff0c;主要是由大豆经过发酵酿造而成。酱油由酱演变而来&#xff0c;早在三千多年前&#xff0c;中国就有制作酱的记载了。 本期百趣代谢组学文献分享为大家分享的文献是百趣生物协助客户发表的关于两种…

Git cherry-pick

Git cherry-pick 当有多个分支&#xff0c;想将一个分支 A 的提交合并到另一个分支 B 一&#xff1a;将分支A的所有提交合并到分支B&#xff0c;执行合并即可 二&#xff1a;将分支A 的某一次提交合并到分支 B&#xff0c;需要使用 git cherry-pick commit 命令 如下图&#…

随机森林-sklearn

随机森林 1.概述 1.1 集成算法概述 本身并不是一个单独的机器学习算法&#xff0c;而是通过在数据上构建多个模型&#xff0c;集成所有模型的建模结果。以此来获得最好的结果。 集成算法的目标&#xff1a; 集成算法会考虑多个评估器的建模结果&#xff0c;汇总之后得到一个…

物联网低功耗蓝牙核心配置技术: 赋能智能家居和智能工业场景

蓝牙我们都不陌生&#xff0c;早已成为深入我们生活的一项科技。不过&#xff0c;我们所知所用的还只是蓝牙的一部分。而蓝牙目前作为物联网中的一项重要通信技术&#xff0c;其应用还远远不止这些&#xff0c;今天就为大家讲讲蓝牙技术中的低功耗技术的应用及分类。 蓝牙低功耗…

原神私服搭建教程 (最新版)

搭建教程 1.准备阶段 1.请先确保电脑内有这些安装环境&#xff0c;否则私服无法运行&#xff01;&#xff01;&#xff01; MongoDB Python3.8 java17 mitmproxy 没有请在群文件下载安装环境&#xff0c;安装即可。特别强调&#xff1a;java17直接放在C:\Program Files目录下即…

初识Kubernetes:(4)Kubernetes实战入门

初识Kubernetes&#xff1a;&#xff08;4&#xff09;Kubernetes实战入门1 前言2 Namespace2.1 概述2.2 应用示例3 Pod3.1 概述3.2 语法及应用示例1 前言 介绍如何在kubernetes集群中部署一个Nginx服务&#xff0c;并且能够对其访问。 2 Namespace 2.1 概述 Namespace是ku…

写给Java程序员的GRPC入门系列(2)

点击上方GRPC专栏看完整系列 文章目录Abstract前置依赖本文初始状态编写protobuffer文件生成代码下一步Abstract 网上有很多GRPC的例子&#xff0c;但是却没有能够写给普通Java开发人员手把手入门少走弯路的教程。 本教程保证按照步骤一步步来你就可以完成GRPC从0到1的构建。 …

模型驱动PDR、数据驱动PDR实验效果对比

本学期的室内导航位置服务课程结束了&#xff0c;最后有一个结课作业做了一些工作&#xff0c;在这里分享给大家&#xff0c;同时也是自己的一个记录。 主要内容包括以下四个方面&#xff1a; 模型驱动PDR数据驱动PDR实验效果对比模型驱动PDR测试效果数据驱动PDR-RoNIN官方预训…

JSP ssh相亲网站系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh相亲系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发 。开发环境为TOMCAT7.0,Myeclip…

MergeTree原理之存储

我们都知道在MergeTree中数据是按列存储的&#xff0c;但是具体到存储的细节、以及如何工作的&#xff0c;都存在很多疑问。数据存储&#xff0c;就好比一本书中的文字&#xff0c;在排版时&#xff0c;绝不会密密麻麻地把文字堆满&#xff0c;这样会导致难以阅读。更为优雅的做…

Git学习:各阶段回退方法

文章目录一、问题背景二、解决方式1. 回退情况1&#xff1a;文件在工作区进行回退2. 回退情况2&#xff1a;文件在暂存区进行回退3. 回退情况3&#xff1a;文件在本地仓库进行回退4. 回退情况4&#xff1a;文件已经在远程仓库中一、问题背景 Git 是分布式的软件管理系统。在把…

代码随想录拓展day4 205. 同构字符串;1002. 查找常用字符;925.长按键入;844.比较含退格的字符串

代码随想录拓展day4 205. 同构字符串&#xff1b;1002. 查找常用字符&#xff1b;925.长按键入&#xff1b;844.比较含退格的字符串 哈希表和字符串的一些应用&#xff0c;放到一起了。 同构字符串 https://leetcode.cn/problems/isomorphic-strings/description/ 刚开始以…

spring boot:集成支付宝(沙箱环境)(spring boot 2.4.0 / wap/h5方式 )

一&#xff0c;配置支付宝沙箱环境: 1,沙箱的地址: 登录 - 支付宝 也可以登录后&#xff0c;从控制台点击 研发服务 进入 2&#xff0c;下载开发助手:并生成密钥 从这个页面&#xff0c;按自己所在的平台下载&#xff0c; 当前支持 windows,macos 开发助手简介 &#xf…

自定义Tango Control设备服务在Ubuntu中的测试

文章目录环境create a device classcompile the device classregister the devicestart the deviceexplore the device故障问题解决参考继续上一篇&#xff1a;https://blog.csdn.net/woshigaowei5146/article/details/128443892?spm1001.2014.3001.5501 环境 虚拟机&#xf…

布隆过滤器 以及缓存穿透问题

1. 前言 今天从客观的角度来分析下&#xff0c;什么是缓存穿透&#xff0c;什么是布隆过滤器&#xff0c;布隆过滤器是如何解决缓存穿透的。 2. 适合人群 对布隆过滤器不熟悉的人对Redis 缓存穿透不熟悉的人 3. 开始 3.1 什么是缓存穿透 其实通过上图我们可以知道&#xff0…

(七)Filter

Filter 表示过滤器&#xff0c;是JavaWeb 三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。 过滤器一般完成一些通用的操作&#xff0c;比如&#xff1a;权限控制、统一编码处理、敏感字符处理等等..一、Filte…

彻底理解Redis持久化

前言 大家都知道Redis一个内存数据库,它支持2种持久化方式&#xff1a;RDB(Snapshot 内存快照) &#xff0c;AOF(append only file)。持久化功能将内存中的数据同步到磁盘来避免Redis发生异常导致数据丢失的情况。当Redis实例重启时&#xff0c;即可利用之前持久化的文件实现数…

软件项目管理教程

软件项目管理 1. 软件项目管理 1.1 概述 概念 项目是为了创造一个唯一的产品或提供一个唯一的服务而进行的临时性的努力 软件项目特征 目标性 相关性 周期性 独特性 没有完全一样的项目”&#xff0c;项目的这种独特性对实际项目管理有非常重要的指导意义&#xff0c;因此…