Sequence(二分 + 线段树)

H-Sequence_2020ICPC 江西省大学生程序设计竞赛(重现赛)@Joanh_Lan (nowcoder.com)

题目描述

 给定一个包含n个整数的数组a,你要对它执行两种类型的m个操作。1.给定两个整数x,y,将索引x的个数替换为数字y,即ax:=y。2.给定一个整数x,打印a的连续子序列的个数,其最小值为ax。它保证数组a在任何时候都没有重复的值。

输入描述:

第一行包含两个整数n,m(1Sn,mS105),其中n是数组的大小,m是要执行的操作的数量。第二行包含n个整数,第i个整数是ai (1SaiS231-1)然后是m行,依次描述m个你要执行的操作。每行以一个整数optE[1,2]开始,表示要执行的操作类型。如果opt=1,则会出现两个整数x, y (1Sxsn,1Sys231-1),如上所述。如果opt=2,一个整数x (1sxsn)紧随其后,如上所述。

输出描述:

对于类型2的每个操作,在一行上打印一个整数作为答案。

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

示例1

输入

复制

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

题解:
(反思:写题时越是有思路,越应该仔细推敲,看能不能以更简单的代码实现,本来已经想到二分了,确想了一直及其傻逼的实现,为啥不直接用二分???)!!!

题意很容易理解,看有多少子串最小值是a[p],暴力的解法就是每次向所求的下标左右遍历,直到找到比他小的,这样我们就知道最左和最右的下标l,r,输出(p - l + 1)*(r - l + 1)即可

可是每次遍历的话,时间复杂度肯定会超

所以我们利用线段树可以求每一段最小值,并且可以进行单点修改

那我们如何求左右边界?

利用两次二分,左右check

L,p  p,R是最小值是否a[p]

 

#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
//#define int long long
ll mod = 998244353;
struct node
{
	int l,r;
	int mi;
}tre[400060];
int a[100050];
void pushup(int rt)
{
	tre[rt].mi = min(tre[rt*2].mi,tre[rt*2 + 1].mi);
}
void build(int rt,int l,int r)
{
	tre[rt].l = l;
	tre[rt].r = r;
	if(l == r)
	{
		tre[rt].mi = a[l];
		return ;
	}
	int mid = (l + r)/2;
	build(rt*2,l,mid);
	build(rt*2+1,mid + 1,r);
	pushup(rt);
}
void updata(int rt,int l,int r,int pos)
{
	if(tre[rt].l == l&& tre[rt].r == r)
	{
		tre[rt].mi = pos;
		return;
	}
	
	int mid=(tre[rt].l+tre[rt].r)/2;
	if(l<=mid)
	{
		updata(2*rt,l,r,pos);
	} 
	if(r>mid)
	{
		updata(2*rt+1,l,r,pos);
	}
	pushup(rt);
}
int ask(int rt,int l,int r)
{
	if(tre[rt].l >= l&&tre[rt].r <= r)
	{
		return tre[rt].mi;
	}
	int ans = (1 << 31) - 1;
	int mid = (tre[rt].l + tre[rt].r)/2;
	if(l <= mid)
	{
		ans = min(ans,ask(rt*2,l,r));
	}
	if(r > mid)
	{
		ans = min(ans,ask(rt*2 + 1,l,r));
	}
	return ans;
}
void solve()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i = 1;i <= n;i++)
	{
		scanf("%d",&a[i]);
	}
	build(1,1,n); 
	while(m--)
	{
		int op;
		scanf("%d",&op);
		if(op == 1)
		{
			int x,pos;
			scanf("%d%d",&x,&pos);
			updata(1,x,x,pos); 
			a[x] = pos;
		}
		else
		{
			int p;
			scanf("%d",&p);
			int l = 1,r = p;
			while(l <= r)
			{
				int mid = (l + r)/2;
				if(ask(1,mid,p) == a[p])
				{
					r = mid - 1;
				}
				else
				{
					l = mid + 1;
				}
			}
			ll L = l;
			l = p,r = n;
			while(l <= r)
			{
				int mid = (l + r)/2;
				if(ask(1,p,mid) == a[p])
				{
					l = mid + 1;
				}
				else
				{
					r = mid - 1;
				}
			}
			ll R = r;
			printf("%lld\n",(ll)(p - L + 1)*(r - p + 1));
		}
	}
}

signed main()
{
//	ios::sync_with_stdio(0);
//	cin.tie(0);cout.tie(0);
	int t = 1;
//	cin >> t;
	while(t--)
	{
		solve(); 
	}
}

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

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

相关文章

【软考五】数据库(做题)

该文章不适合学习数据库&#xff0c;适合考证&#xff0c;遇到实际问题的&#xff0c;不要在这儿浪费时间。切记切记 软考之数据库一、概念数据模型&#xff08;下午题常考&#xff09;二、结构数据模型关系模型1、关系模型中基本术语2、关系模型中的关系完整性约束3、关系代数…

蓝桥杯 回忆迷宫 BFS DFS暴力模拟

⭐ 题目地址 样例输入 17 UUUULLLLDDDDRRRRU样例输出 ***** * * * *** * * *** * * *** * * ******&#x1f920; 注意方向&#xff1a;颠倒数组&#xff0c;行下标 是 y&#xff0c;列下标 是 x import java.util.*;public class Main { static int n;static int …

如何用jmeter+ant+jenkins搭建一个接口自动化测试框架?

目录 前言 一、什么是Jmeter&#xff1f; 二、什么是Ant&#xff1f; 三、什么是Jenkins&#xff1f; 四、如何构建一个JmeterAntJenkins的接口自动化测试框架&#xff1f; 五、JmeterAntJenkins接口自动化测试框架的优势和特点 六、总结 前言 Jmeter是一款功能强大的开…

2023年Win11备份文件的快捷方式

文件备份对于数据保护非常重要。无论是什么类型的文件&#xff0c;如照片、文档、音频、视频&#xff0c;它们对您来说都是独一无二的、珍贵的&#xff0c;因此您想备份文件并保护它们。 首先&#xff0c;备份文件无疑是保护文件的好习惯&#xff0c;尤其是定时备份。其次&…

笔记本可自行更换CPU、独显了,老外用它手搓了台“PS5”

前面说到微软打算在 Win12 出来前搞出个模块化的Windows&#xff1a;下一个系统不是Win12&#xff0c;微软要复活Win10X。 模块化不用小蝾再过多介绍了&#xff0c;就像积木一样拼在一起组成一个整体。 优势就很明显了&#xff0c;由于每个部分都是单独的模块&#xff0c;更新…

ChatGPT如何写作-怎么让chatGPT批量写作

ChatGPT如何写作 使用 ChatGPT 进行写作一般可以遵循以下步骤&#xff1a; 定义写作主题和目的。确定写作主题和目的&#xff0c;包括要解决的问题、目标读者群体以及需要涵盖的主要内容。 收集文献和资料。收集与主题相关的文献和资料&#xff0c;可以从互联网、书籍、报刊杂…

Spring Cloud组件源码之OpenFeign源码分析

" Spring 到底是春天的来临万物复苏&#xff0c;还是春转夏的干燥又炎热呢&#xff1f;" Spring的来临让JavaEE走向了另一个高度。便捷的开发&#xff0c;完美的生态。物极必反&#xff0c;学习Spring的成本越来越低&#xff0c;导致Java程序员越来越密集&#xff0…

VS2022编译libui库

libui是一个 C 中简单且可移植(但并非不灵活)的 GUI 库,它使用每个平台原生的GUI技术进行绘制。 官网地址:链接 本文将使用VS2022编译libui库,操作系统为Windows10。 1. 下载源代码 首先在官网下载源代码,由于此代码不依赖第三库,故只需下载源代码即可进行编译。 我下…

JavaScript函数中的arguments(js函数中的arguments,函数默认参数arguments)

简述&#xff1a;js中的函数大家都比较熟悉&#xff0c;今天来分享下函数中的默认参数arguments。js的函数参数和其他的语言有些不同&#xff0c;它并不介意你传进来多少个参数&#xff0c;以及参数的数据类型&#xff0c;即使你在定义函数时&#xff0c;只设置了两个形参&…

「解析」Matplotlib 绘制折线图

相比于【优雅】matplotlib 常见图、【优雅】matplotlib 3D图 而言&#xff0c;折线图使用的频率会更高一些&#xff0c;在此整理下最近使用 Matplotlib 绘制折线图常用的一些配置&#xff0c;小伙伴们只需要修改对应的 aug_list、list 即可直接使用 # !/usr/bin/env python …

asp.net mvc学习(三)

Razor语法 Razor语法特点 结构性强&#xff0c;容易阅读。易于学习。不是新的语言。在任何编辑器上编写Razor都很容易。与ide充分结合。 Razor语法主要规则 Razor代码封装于{...}中。 行内表达式&#xff08;变量和函数&#xff09;以开头 代码语句以分号结尾 字符串由引号…

Python 进阶指南(编程轻松进阶):八、常见的 Python 陷阱

原文&#xff1a;http://inventwithpython.com/beyond/chapter8.html 虽然 Python 是我最喜欢的编程语言&#xff0c;但它也不是没有缺陷。每种语言都有缺点&#xff08;有些比其他的多&#xff09;&#xff0c;Python 也不例外。新的 Python 程序员必须学会避免一些常见的“陷…

JavaScript 中问号的三种用法 ??和?.以及?: 您知道吗?

最近看了一些关于JavaScript的测试脚本&#xff0c;觉得JS 中问号的用法还是蛮有意思的&#xff0c;于是做了一下总结&#xff0c;在这里分享给大家&#xff01;JS中的问号大概有三种用法&#xff0c;分别是&#xff1a;空值合并操作符、可选链操作符和三目运算。 问号问号&…

如何使用手机远程锁定电脑?

​“有时我已经到家了&#xff0c;却忘记锁上我的公司的电脑。每次我都害怕我电脑上的数据丢失。我可以在手机上远程锁定我的Windows计算机以避免这个问题吗&#xff1f;” 答案是肯定的&#xff01;很多人可能会遇到同样的下班不锁电脑的问题&#xff0c;有的人可能尝…

新规拉开中国生成式AI“百团大战”序幕?

AI将走向何方&#xff1f; ChatGPT在全球范围掀起的AI热潮正在引发越来越多的讨论&#xff0c;AI该如何管理&#xff1f;AI该如何发展&#xff1f;一系列问题都成为人们热议的焦点。此前&#xff0c;马斯克等海外名人就在网络上呼吁OpenAI暂停ChatGPT的模型训练和迭代&#xf…

算法套路八——二叉树深度优先遍历(前、中、后序遍历)

算法套路八——二叉树深度优先遍历&#xff08;前、中、后序遍历&#xff09; 算法示例&#xff1a;LeetCode98&#xff1a;验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只…

Shell脚本之免交互

一、Here Document免交互 1、 概念 Here Document使用I/O重定向的方式将命令列表提供给交互式程序或命令&#xff0c;比如 ftp、cat 或 read 命令。 是标准输入的一种替代品可以帮助脚本开发人员不必使用临时文件来构建输入信息&#xff0c;而是直接就地生产出一个"文件…

No.033<软考>《(高项)备考大全》【第17章】战略管理

【第17章】战略管理1 章节相关2 战略管理2.1 组织战略管理2.1 组织战略类型和层次2.1.1 组织事业战略类型2.1.2 组织事业战略类型2.1.3 组织完整的战略包括三个层次2.1.4 组织战略从层次分为组织层战略、事业层战略、职能层战略等2.1.5 平横计分卡2.1.6 项目组合管理3 练习题参…

Leetcode.111 二叉树的最小深度

题目链接 Leetcode.111 二叉树的最小深度 easy 题目描述 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从 根节点 到 最近叶子节点 的 最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,nul…

车载网络 - Autosar网络管理 - 网络管理简介

一、什么是CAN网络管理及它的作用 现在的车辆是由大量的ECU节点组成的&#xff0c;为了能使各ECU能够正确并及时地进行CAN通信&#xff0c;需要有一套机制来统一协调总线上各节点的休眠唤醒&#xff0c;这套机制就是CAN网络管理&#xff08;NM&#xff09;。 网络管理的目的是保…