E—一起走很长的路

news/2025/1/29 10:58:59/文章来源:https://www.cnblogs.com/benscode/p/18692928

题目链接:https://ac.nowcoder.com/acm/contest/95334/E

题意:

给定一个有n个元素的数组,查询q次。每次选择一个区间从l到r,遵循以下规则
类似于多米诺骨牌,遍历区间元素,轮到ai时,若它前面在区间内元素的总和大于等于ai,那么就可以推倒,反之不可以。
现在询问为了能都将区间的元素的全部遍历到,要将区间元素不受限制的+1或-1(不影响原数组并且是一次性全部操作完),请你输出每次的操作次数。

思路:

不难发现为了能够推倒区间全部的多米诺,我们尽量要在靠前的位置,也就是第一个位置l加上某个数。这样比减更符合自然想法(因为前缀和是“滚雪球似的增长”,减去明显要付出更多代价)
对于l->r范围,发现需要对于所有的i:l->r-1都要sumi-suml-1>=ai+1成立。发现可以移项sumi-ai+1>=suml-1。预处理出一个数组d[i]=sumi-ai+1(范围:1->n-1)
对于每次查询只要d[l]->d[r-1]范围的最小值比suml-1要小,就要进行操作在l上+。因为可以使所有d[i]都变大,所以只要让那个最小值加上一个值等于suml-1,那么答案就是suml-1-那个最小值
时间复杂度需要O(qlogn),通过线段树维护d数组区间最小值
代码层面:需要注意题目数据范围开long long,然后线段树query_min 初始化ans值应该为llmax!!! (byd就因为这个debug好久,骇死我力!)

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll llmax=LLONG_MAX;
int n,q;
const int maxn=2e5+5;
const int maxnn=1e7;
ll arr[maxn];
ll sum[maxn];
ll d[maxn];
//sumi-suml-1>=arri+1
//sumi-arri+1>=suml-1
struct node{int l,r;int min;
};
node tr[maxnn];
void build(int p,int l,int r){tr[p].l=l;tr[p].r=r;if(l==r){tr[p].min=d[l];return;}int mid=l+r>>1;build(2*p,l,mid);build(2*p+1,mid+1,r);tr[p].min=min(tr[2*p].min,tr[2*p+1].min);
}
int query_min(int p,int l,int r)
{if(l<=tr[p].l&&tr[p].r<=r){return tr[p].min;}int ans=llmax;int mid=tr[p].l+tr[p].r>>1;if(l<=mid)ans=min(ans,query_min(2*p,l,r));if(r>mid)ans=min(ans,query_min(2*p+1,l,r));return ans;
}
signed main()
{ios::sync_with_stdio(false),cin.tie(0);cin>>n>>q;for(int i=1;i<=n;i++){cin>>arr[i];sum[i]=sum[i-1]+arr[i];}if(n==1){while(q--){int l,r;cin>>l>>r;cout<<0<<endl;}return 0;}for(int i=1;i<=n-1;i++){d[i]=sum[i]-arr[i+1];
//		cout<<d[i]<<endl;}build(1,1,n-1);while(q--){int l,r;cin>>l>>r;ll ans=0;if(l==r){cout<<0<<endl;continue;}ans=sum[l-1]-query_min(1,l,r-1);
//		cout<<sum[l-1]<<' '<<query_min(1,l,r-1)<<endl;if(ans<0)cout<<0<<endl;else cout<<ans<<endl;}return 0;
}

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

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

相关文章

常见的7种排序算法(转载)

本文介绍了七种常见的排序算法:冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序和堆排序。每种算法通过具体步骤和代码实现进行详细讲解,包括时间复杂度分析。文中提供了丰富的示例代码和图解,帮助读者更好地理解各排序算法的工作原理及应用场景。【版权声明】…

【MySQL】MySQL为什么 不用 Docker部署?

MySQL为什么不推荐使用Docker部署 docker可以从远程仓库拉取镜像然后通过镜像快速的部署应用,非常的方便快捷, 但是 , 为什么 一般公司的 Mysql 不用docker部署,而是部署在 物理机器上呢? 一、DB有状态,不方便扩容1.1 Docker容器的两大类型: 有状态 、无状态的区分1.2 My…

RocketMQ实战—1.订单系统面临的技术挑战

大纲 1.一个订单系统的整体架构、业务流程及负载情况 2.订单系统面临的技术问题一:下订单的同时还要发券、发红包、Push推送等导致性能太差 3.订单系统面临的技术问题二:订单退款时经常流程失败导致无法完成退款 4.订单系统面临的技术问题三:第三方客户系统的对接耦合性太高…

【docker】自建 docker 镜像加速

1. 背景 由于神秘原因,国内用户逐渐无法访问 Docker Hub 仓库。这对于开发者来说是个不小的难题。而这个解决方案是通过赛博菩萨 cloudflare(简称 CF)中转请求,解决访问限制并加速访问。刚好之前分享了如何获取免费域名,今天就来分享一下如何用免费域名在CF部署自己的 doc…

hive--MySQL8错误--ERROR 1410 (42000): You are not allowed to create a user with GRANT

错误展示:解决办法: create user hadoopguide@localhost identified by hadoopguide; grant all privileges on hadoopguide.* to hadoopguide@localhost with grant option; 效果图:错误原因: MySQL 8.0 及以上版本不允许在授予权限时隐式创建用户。所以显式创建用户后再授…

【Linux】Linux一键切换镜像源,告别慢速下载,国内镜像让你飞起来!

简介 本文教你如何通过一键切换 Linux 镜像源,快速提高系统软件包的下载速度,告别“慢”的困扰,轻松提升体验。 项目地址:https://github.com/SuperManito/LinuxMirrors 官方文档:https://linuxmirrors.cn/开头 Linux 系统在安装和更新软件时,经常会遇到速度慢的问题,尤…

day05-面向对象编程:基础语法

Java面向对象:类的基础语法[ 任务列表 ] 1.面向对象快速入门 2.什么是面向对象 3.类的基础语法——构造器 4.类的基础语法——this关键字 5.类的基础语法——封装 6.类的基础语法——javabean 7.类的基础语法——static 8.其他———————————————————————…

【docker】通过Docker一键部署群晖NAS!支持自定义内存和CPU、多磁盘挂载、KVM加速!

声明 文中所涉及的技术、思路和工具仅供以学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担。如有需要,请购买正版软件。今天给大家介绍一个开源项目,让你能够在Linux或者Window11上通过Docker部署群晖NAS,支持多磁盘挂载、KVM加速等等,让你享受…

渗透测试速成

123123321渗透测试速成 主动信息收集 MSF渗透 python反弹一个交互式shell MySQL基础:登录,增删改查.. 框架识别利用:whatweb 信息收集速通 直接arp-scan -l,快速找到IP地址 然后,nmap -A ip+子网掩码,进行全面扫描 探测目标IP地址: 探测主机:arp-scan -l(推荐) 探测当…

Spring AI 提交 PR 实战指南:避免常见坑

今天,我们将简单地了解如何向 Spring AI 提交 PR(Pull Request)。在这个过程中,有一些常见的坑需要大家注意和避免,特别是在 Git 操作方面。我们会重点关注提交信息的规范,如何进行一次合并提交,以及其他在代码质量和结构上需要遵守的要求。 最后,我们会快速回顾一下与…

第一个java程序,HelloWorld

第一个java程序,HelloWorld创建一个java程序后缀名为java编写代码 public class Hello {public static void main (String[] args) {System.out.println("HelloWorld");} }编译 javac java文件 ,会生成一个class文件运行Java文件,java class文件

[Jest] 整合 webpack 综合练习

这一小节,我们来做一个综合的练习,该练习会整合:typescript webpack jest准备工作 首先创建项目目录,通过 npm init -y 进行初始化。 整个项目我们打算使用 typescript 进行开发,因此需要安装 typescript npm i typescript -D然后通过 npx tsc --init 创建 ts 的配置文件,…