线段树例题

目录

1.Sequence

2.Peach Conference

3.Permutation Subsequence


1.Sequence

题目描述:

Given an array a consisting of n integers, on which you are to perform m operations of two types.

1.Given two integers x,y, replace the number of index x with number y. That is ax:=y.

2.Given one integer x, print the number of consecutive subsequences of a, whose minimum value equals to ax.

It's guaranteed that there are no duplicated value in array a at any moment.

输入描述:

The first line contains two intergers n,m(1≤n,m≤10^5),where n is the size of the array and m is the number of operations to perform.

The second line contains n integer, the ith integer is ai (1≤ai≤2^31-1)

Then,m lines follow, describing m operation you are to perform in order.
Each line start with an integer opt∈[1,2], meaning the type of operation to perform.

If opt=1,two integers x, y (1≤x≤n,1≤y≤2^31-1) follows,mentioned above.

If opt=2,one integers x (1≤x≤n) follows, mentioned above.

输出描述:
For each operation of type 2, print one integer on one line as the answer.

输入样例:

10 5
8 3 6 2 10 9 5 7 1 4 
2 2
1 9 11
1 5 12
2 4
1 8 18

输出样例:

4
28

思路: 用线段树进行op=1的单点修改,用二分+区间查询进行op=2的查找Ax左边最后一个小于Ax的位置ans1,然后查找Ax右边第一个小于Ax的位置ans2,答案就是(x-ans1+1)*(ans2-x+1),这里的二分还是有许多细节需要注意,这里就不多说了,大家看代码理解吧

#include<iostream>
#include<limits.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,m,w[N];

struct node{
    int l,r;
    int mind;
}tr[4*N];

void pushup(int u)
{
    tr[u].mind=min(tr[u<<1].mind,tr[u<<1|1].mind);
}

void build(int u,int l,int r)
{
    if(l==r)  tr[u]={l,l,w[l]};
    else
    {
        tr[u]={l,r};
        int mid=(l+r)>>1;
        build(u<<1,l,mid),build(u<<1|1,mid+1,r);
        pushup(u);
    }
}

int query(int u,int l,int r)
{
    if(tr[u].l>=l&&tr[u].r<=r) return tr[u].mind;
    else
    {
        int mid=(tr[u].l+tr[u].r)>>1;
        int v=INT64_MAX;
        if(mid>=l) v=min(query(u<<1,l,r),v);
        if(mid<r) v=min(v,query(u<<1|1,l,r));
        return v;
    }
}

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

int32_t main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>w[i];
    build(1,1,n);

    while(m--)
    {
        int type;cin>>type;
        if(type==1)
        {
            int x,y;cin>>x>>y;
            w[x]=y;
            modify(1,x,y);
        }
        else
        {
            int x;cin>>x;
            int a=w[x]; 
            int l1=1,r1=x-1,ans1,ans2;
            while(l1<=r1)//先二分x的左边
            {
                int mid=(l1+r1+1)>>1;
                if(query(1,mid,x-1)<a) l1=mid+1;//如果mid~x-1这个区间存在比a更小的值,则区间向右边移动一个单位,缩小范围
                else r1=mid-1;//反之则扩大范围,向左边移动
            }
            ans1=l1;//取离x更近的值
            int l2=x+1,r2=n;
            while(l2<=r2)//二分x的右边
            {
                int mid=(r2+l2)>>1;
                if(query(1,x+1,mid)<a) r2=mid-1;//如果x+1~mid这个范围存在比a更小的值,则区间向左移动一个单位,缩小范围
                else l2=mid+1;//反之则扩大范围,向右边移动
                
            }
            ans2=r2;
            cout<<(x-ans1+1)*(ans2-x+1)<<endl;
        }
    }
}

2.Peach Conference

题目描述:

Sun Wukong was honored as the great saint of Qitian. He was very happy, so he held a peach meeting for the monkeys (ID numbered 1 to N). To make it more interesting, Sun Wukong decided to throw the dice. The conference will roll the dice Q times, forming Q instructions, each in the form of ’m a b’, where m is an integer label, and a and b are monkey’s ID. The meaning of each instruction is as follows:

1. If m > 0, send m peaches to each monkey in ID interval [a, b];

2. If m < 0, remove |m| peaches from each monkey in the ID interval [a, b] (if the number of peaches from any monkey is less than |m|, remove all peaches of the monkey);

3. If m = 0, calculate the sum of peaches of each monkey in the interval [a, b]; now you are invited to preside over the peach conference, can you complete the task according to the requirements of Sun Wukong?

输入描述:

The fifirst line contains two positive integers N and Q (1 ≤ N, Q ≤ 100000), representing N monkeys and Q instructions, respectively.

Next, there are Q lines, and each line corresponds to one instruction. Each instruction is composed of three integers m (−10000 ≤ m ≤ 10000), a and b (1 ≤ a ≤ b ≤ N), which respectively represent the label m and the ID interval of monkey.

输出描述:


Output each instruction with label m = 0 as an integer in order per line, that is, the sum of peaches of each monkey in the interval [a, b].

输入样例:

10 8
1 1 10
0 4 6
2 3 6
0 4 5
-2 5 8
0 4 7
-2 4 5
0 3 5

输出样例:

3
6
5
4

思路: 线段树+懒标记,如果在区间[l,r]中最小值减m会>=0,则不用进行标记,如果最大值减m<=0,则要进行标记,具体请看代码

#include<iostream>
#include<cstring>
#define int long long
using namespace std;
const int N=1e5+5;

int n,q,w[N];
struct node{
    int l,r;
    int sum,mind,maxd,add,clear;
}tr[4*N];

void pushdown(int u)
{
   node &left=tr[u<<1],&right=tr[u<<1|1],&root=tr[u];
    if(root.clear)
    {
        left.sum=left.mind=left.maxd=left.add=0;
        left.clear=1;
        right.sum=right.mind=right.maxd=right.add=0;
        right.clear=1;
        root.clear=0;
       
    }
    if(root.add)
    {
        left.sum+=(left.r-left.l+1)*root.add;
        left.mind+=root.add,left.maxd+=root.add;
        left.add+=root.add;
        right.sum+=(right.r-right.l+1)*root.add;
        right.mind+=root.add,right.maxd+=root.add;
        right.add+=root.add;
        root.add=0;
        
        return ;
    }
   
}

void pushup(int u)
{
    tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
    tr[u].maxd=max(tr[u<<1].maxd,tr[u<<1|1].maxd);
    tr[u].mind=min(tr[u<<1].mind,tr[u<<1|1].mind);
    
}

void Build(int u,int l,int r)
{
    if(l==r) tr[u]={l,l};
    else
    {
        tr[u]={l,r};
        int mid=(l+r)>>1;
        Build(u<<1,l,mid),Build(u<<1|1,mid+1,r);
        pushup(u);
    }
}

void modify(int u,int l,int r,int d)
{
      if(tr[u].l>=l&&tr[u].r<=r) 
      {
          if(tr[u].mind+d>=0)
          {
              tr[u].sum+=(tr[u].r-tr[u].l+1)*d;
              tr[u].add+=d;
              tr[u].maxd+=d;
              tr[u].mind+=d;
              return ;
          }
          if(tr[u].maxd+d<=0)
          {
              tr[u].sum=tr[u].mind=tr[u].maxd=tr[u].add=0;
              tr[u].clear=1;
              return ;
          }
      }

        pushdown(u);
        int mid=(tr[u].l+tr[u].r)>>1;
        if(mid>=l) modify(u<<1,l,r,d);
        if(mid<r) modify(u<<1|1,l,r,d);
        pushup(u);
    
}

int query(int u,int l,int r)
{
    if(tr[u].l>=l&&tr[u].r<=r)
    return tr[u].sum;
    else
    {
        pushdown(u);
        int mid=(tr[u].l+tr[u].r)>>1;
        int v=0;
        if(mid>=l)  v=query(u<<1,l,r);
        if(mid<r) v+=query(u<<1|1,l,r);
        return v;
    }
}

int32_t main()
{
    cin>>n>>q;
    Build(1,1,n);
    while(q--)
    {
        int m,l,r;cin>>m>>l>>r;
        if(m==0) cout<<query(1,l,r)<<endl;
        else  modify(1,l,r,m);
    }
}

3.Permutation Subsequence

注意 :要用线段树来优化找区间最值,不然会超时

代码:

#include<iostream>
#include<cmath>
using namespace std;
const int N=2e5+5;
int a[N],book[N],n,k;
struct node{
    int l, r;
    int maxd ,mind;
}tr[4*N];

void pushup(int u)
{
    tr[u].maxd=max(tr[u<<1].maxd,tr[u<<1|1].maxd);
    tr[u].mind=min(tr[u<<1].mind,tr[u<<1|1].mind);
}

void build(int u,int l,int r)
{
    if(l==r) tr[u]={l,l,book[l],book[l]};
    else 
    {
        int mid=(l+r)>>1;
        tr[u]={l,r};
        build(u<<1,l,mid),build(u<<1|1,mid+1,r);
        pushup(u);
    }
}

int query(int u,int l,int r,int type)
{
    if(tr[u].l>=l&&tr[u].r<=r) 
    {
        if(type==1) return tr[u].mind;
        else return tr[u].maxd;
    }
    else
    {
        int mid=(tr[u].l+tr[u].r)>>1;
        if(type==1)
        {
            int min_=0x3f3f3f3f;
             if(mid>=l) min_=query(u<<1,l,r,type);
             if(mid<r) min_=min(min_,query(u<<1|1,l,r,type));
             return min_;
        }
        else
        {
            int max_=0;
            if(mid>=l) max_=query(u<<1,l,r,type);
            if(mid<r) max_=max(max_,query(u<<1|1,l,r,type));
            return max_;
        }
       
    }
}
int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++) 
    {
        cin>>a[i];
        book[a[i]]=i;
    }
    int min_=0x3f3f3f3f;
    build(1,1,n);
    for(int i=1;i<=n-k+1;i++)
    {
       
      int max_=query(1,i,i+k-1,2);
      int mi_=query(1,i,i+k-1,1);
       min_=min(min_,abs(max_-mi_));

    }
    cout<<min_;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows10(家庭版)中DockerDesktop(docker)的配置、安装、修改镜像源、使用

场景 Windows10中Docker的安装与遇到的那些坑: Windows10中Docker的安装与遇到的那些坑_在 docker.core.logging.httpclientexceptionintercept-CSDN博客 上面讲Docker Desktop在windows10非家庭版上的安装&#xff0c;如果是家庭版&#xff0c;则需要执行如下步骤。 注&am…

动态规划之买卖股票大集合

目录 引言 1.只能进行一次买卖股票&#xff08;最多只能买一股股票&#xff09; 2.可以进行多次股票买卖&#xff0c;且没有手续费&#xff08;最多只能买一股股票&#xff09; 3.可以进行多次股票买卖&#xff0c;但是有冷冻期&#xff0c;无手续费&#xff08;最多只能买一…

Xunsearch:实现拼音搜索和中文分词功能

首先我们需要安装xunsearch扩展库&#xff0c;参考 1、设置分词器和拼音搜索功能 在创建Xunsearch对象后&#xff0c;可以设置相应的分词器和拼音搜索功能。以下代码示例演示了如何设置分词器和拼音搜索功能&#xff1a; $index $xunsearch->index; $index->setToken…

Cesium For Unity 在Unity中无法下载的问题

Unity 下载失败&#xff0c;提供百度网盘“com.cesium.unity-1.10.0.tgz”下载链接 链接&#xff1a;https://pan.baidu.com/s/1PybXQ8EvkRofOKD6rSN66g?pwd1234 提取码&#xff1a;1234 导入方法&#xff1a; 1.打开PackageManager;Window-PackageManager 2.在PackageMan…

Leetcode621. 任务调度器

Every day a Leetcode 题目来源&#xff1a;621. 任务调度器 类似题目&#xff1a;1953. 你可以工作的最大周数 解法1&#xff1a;贪心 本质上来说&#xff0c;我们需要构造一个尽量短的&#xff0c;相同元素间隔 > (n1) 的序列。 用一个数组 cnt 统计每个任务的次数。…

【论文阅读笔记】The Google File System

1 简介 Google File System (GFS) 是一个可扩展的分布式文件系统&#xff0c;专为快速增长的Google数据处理需求而设计。这篇论文发表于2003年&#xff0c;此前已在Google内部大规模应用。 GFS不仅追求性能、可伸缩性、可靠性和可用性等传统分布式文件系统的设计目标&#xf…

如何使用 Connector API 将数据提取到 Elasticsearch Serverless 中

作者&#xff1a;来自 Elastic Jedr Blaszyk Elasticsearch 支持一系列摄取方法。 其中之一是 Elastic Connectors&#xff0c;它将 SQL 数据库或 SharePoint Online 等外部数据源与 Elasticsearch 索引同步。 连接器对于在现有数据之上构建强大的搜索体验特别有用。 例如&…

新火种AI|警钟长鸣!教唆自杀,威胁人类,破坏生态,AI的“反攻”值得深思...

作者&#xff1a;小岩 编辑&#xff1a;彩云 在昨天的文章中&#xff0c;我们提到了谷歌的AI Overview竟然教唆情绪低迷的网友“从金门大桥跳下去”。很多人觉得&#xff0c;这只是AI 模型的一次错误判断&#xff0c;不会有人真的会因此而照做。但现实就是比小说电影中的桥段…

Linux shell编程学习笔记51: cat /proc/cpuinfo:查看CPU详细信息

0 前言 2024年的网络安全检查又开始了&#xff0c;对于使用基于Linux的国产电脑&#xff0c;我们可以编写一个脚本来收集系统的有关信息。对于中央处理器CPU比如&#xff0c;我们可以使用cat /proc/cpuinfo命令来收集中央处理器CPU的信息。 1. /proc/cpuinfo 保存了系统的cpu…

【学习心得】PyTorch的知识要点复习(持续更新)

PyTorch知识要点复习&#xff0c;目的是为了巩固PyTorch基础、快速回顾、深化理解PyTorch框架。这篇文章会持续更新。 一、本文的一些说明 知识点梳理&#xff1a;我将PyTorch的核心概念和高级技巧进行了系统化的整理&#xff0c;从基础的张量操作到复杂的模型构建与训练。这样…

拉普拉斯IPO:科技与产业深度融合,实现业务领域延展

我国拥有全球最具竞争优势的光伏产业链&#xff0c;基于降本增效的需求&#xff0c;光伏产业对于技术革新具有持续的需求。拉普拉斯新能源科技股份有限公司&#xff08;以下简称“拉普拉斯”&#xff09;凭借深厚的技术积累&#xff0c;以及对光伏产业深刻的理解&#xff0c;聚…

【数据结构】AVL树——平衡二叉搜索树

个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 祝福语&#xff1a;愿你拥抱自由的风 目录 二叉搜索树 AVL树概述 平衡因子 旋转情况分类 左单旋 右单旋 左右双旋 右左双旋 AVL树节点设计 AVL树设计 详解单旋 左单旋 右单旋 详解双旋 左右双旋 平衡因子情况如…

基于ViutualBox+Ubuntu(Linux)的开发环境搭建

实际在选择虚拟机的时候纠结了要用virualbox还是vmware&#xff0c;初步比较结果&#xff1a; 1.virualbox能够使用vmware的硬盘格式&#xff0c;因此可以自由选择。 2.都能够实现主机和宿主机之间的文件夹共享。 3.virualbox是自由软件&#xff0c;vmware是商业软件。 在功能上…

Matplotlib 实践指南:图形样式、风格与标记探索

目录 前言 第一点&#xff1a;导入模块 第二点&#xff1a;创建二维图 第三点&#xff1a;创建统计图 总结 前言 Matplotlib 是一个强大的数据可视化库&#xff0c;可用于创建各种类型的图形。在本文中&#xff0c;我们将研究如何在 Matplotlib 中设置图形的颜色、风格和标记…

CANDela studio之CDDT与CDD

CDDT有更高的权限&#xff0c;作为模板规范CDD文件。 CDD可修改的内容比CDDT少。 CDDT根据诊断协议提供诊断格式&#xff0c;主要就是分类服务和定义服务&#xff0c;一般是OEM释放&#xff0c;然后由供应商细化成自己零部件的CDD文件。 在这里举个例子&#xff0c;OEM在CDDT…

Dubbo生态之初识分布式事务

1.分布式事务简介 传统的关系型数据库只能保证单个数据库中多个数据表的事务特性。一旦多个SQL操作涉及到多个数据库&#xff0c;这类的事务就无法解决跨库事务问题。在传统架构下&#xff0c;这种问题出现的情况非常少&#xff0c;但是在分布式微服务架构中&#xff0c;分布式…

Golang | Leetcode Golang题解之第117题填充每个节点的下一个右侧节点指针II

题目&#xff1a; 题解&#xff1a; func connect(root *Node) *Node {start : rootfor start ! nil {var nextStart, last *Nodehandle : func(cur *Node) {if cur nil {return}if nextStart nil {nextStart cur}if last ! nil {last.Next cur}last cur}for p : start; …

NDIS协议驱动(四)

NDIS 定义对象标识符 (OID) 值&#xff0c;以标识适配器参数&#xff0c;其中包括设备特征、可配置设置和统计信息等操作参数。 协议驱动程序可以查询或设置基础驱动程序的操作参数。 NDIS 还为 NDIS 6.1 及更高版本的协议驱动程序提供直接 OID 请求接口。 直接 OID 请求路径支…

5-时间、日期与组合框

时间、日期与组合框 1 日期时间1.1 日期时间相关的类1.2 日期、时间和字符串的转换1.3 例子 2、组合框2.1 QComboBox2.2 QPlainTextEdit2.3 案例 3、自定义右键菜单 1 日期时间 1.1 日期时间相关的类 QTime 时间数据类型&#xff0c;仅表示时间&#xff0c;如&#xff1a;15:…

nano机器人2:机械臂的视觉抓取

前言 参考链接: 【机械臂入门教程】机械臂视觉抓取从理论到实战 GRCNN 通过神经网络&#xff0c;先进行模型训练&#xff0c;在进行模型评估。 机械臂逆运动学求解 所有串联型6自由度机械臂均是可解的&#xff0c;但这种解通常只能通过数值解法得到&#xff0c;计算难度大&am…