牛客挑战赛65 D.233求min(二维偏序 树状数组/cdq分治)

news2024/11/17 17:27:09

题目

给出长度为n(n<=1e5)的序列a1,a2,...,an​和b1,b2,...,bn(-1e3<=ai,bi<=1e3),

请你找出1≤l≤r≤n,使得min(al+al+1+...+ar, bl+bl+1+...+br)最大,并输出这个值

思路来源

官方题解

LYC_music submission

题解

两种做法,

第一种做法,是按值域w二分,

二分之后,验证答案是否成立时,是一个裸的二维偏序,

复杂度O(nlogwlogn)

第二种做法,

是把min拆开,分两种情况讨论,看哪半边小

即分别讨论sum1[r]-sum1[l-1]<=sum2[r]-sum2[l-1]①

以及sum1[r]-sum1[l-1]>sum2[r]-sum2[l-1]②

统计两次贡献,

比如①,把sum2[i]-sum1[i]看成是一维,记为xi

即(i,xi)要去统计j<=i,xj<=xi的二维偏序,这样的点j对点i的贡献是sum1[i]-sum1[j]

因为是对称的,所以交换sum1和sum2之后,再跑一次

因为有l-1,所以下标从[0,n]

复杂度O(nlogn)

转化成二维偏序之后,

在线:树状数组,离线:cdq分治,典中典

树状数组:

(x,y)两维都很大的时候,考虑把x离散化成下标,y仍然按值存

cdq分治:

先按x排增序,按y归并排序,

在排序过程中考虑x小的值对x大的值的贡献,并令排序后的部分按y呈增序

这里各给出本题O(nlogn)的cdq和bit方式的实现,

代码1(cdq)

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,INF=0x3f3f3f3f;
int n,ans;
struct node{
    int a,b;
}e[N],f[N],g[N];
void cdq(node *f,int l,int r){
    if(l==r)return;
    int mid=(l+r)/2;
    cdq(f,l,mid);
    cdq(f,mid+1,r);
    int i=l,j=mid+1,s=l,mn=INF;
    for(;i<=mid && j<=r;){
        if(f[i].a-f[i].b<=f[j].a-f[j].b){
            mn=min(mn,f[i].b);
            g[s++]=f[i++];
        }
        else{
            ans=max(ans,f[j].b-mn);
            g[s++]=f[j++];
        }
    }
    for(;i<=mid;){
        g[s++]=f[i++];
    }
    for(;j<=r;){
        ans=max(ans,f[j].b-mn);
        g[s++]=f[j++];
    }
    for(int i=l;i<=r;++i){
        f[i]=g[i];
    }
}
int main(){
    scanf("%d",&n);
    ans=-INF;
    for(int i=1;i<=n;++i){
        scanf("%d",&e[i].a);
        e[i].a+=e[i-1].a;
    }
    for(int i=1;i<=n;++i){
        scanf("%d",&e[i].b);
        e[i].b+=e[i-1].b;
        f[i]={e[i].b,e[i].a};
    }
    cdq(e,0,n);
    cdq(f,0,n);
    printf("%d\n",ans);
    return 0;
}

代码2(bit)

树状数组下标不能是0,

那令n++,就起到了加一个0元素的作用

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,inf=0x3f3f3f3f;
int n,tr[N],a[N],b[N],p[N];
int ans=-inf;
void add(int x,int y){
	for(;x<N;x+=x&-x){
		tr[x]=min(tr[x],y);
	}
}
int ask(int x){
	int res=inf;
	for(;x;x-=x&-x){
		res=min(res,tr[x]);
	}
	return res;
}
void solve(){
    sort(p+1,p+n+1,[&](int x,int y){
        return b[x]-a[x]<b[y]-a[y];
    });
    for(int i=1;i<=n;i++)tr[i]=inf;
    int l=1;
    for(int i=1;i<=n;i++){
        int u=p[i];
        while(l<=n&&b[p[l]]-a[p[l]]<=b[u]-a[u]){
            add(p[l],a[p[l]]);
            l++;
        }
        int Y=ask(u-1);
        ans=max(a[u]-Y,ans);
    }
}
int main(){
    scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int x;
        scanf("%d",&x);
		a[i+1]=a[i]+x;
	}
	for(int i=1;i<=n;i++){
		int x;
		scanf("%d",&x);
		b[i+1]=b[i]+x;
	}
	n++;
	for(int i=1;i<=n;i++)p[i]=i;
    solve();
    for(int i=1;i<=n;i++)swap(a[i],b[i]);
    solve();
    printf("%d\n",ans);
    return 0;
}

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

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

相关文章

Python模块和包的介绍(模块含义、用模块好处、模块分类、包和模块的创建)

&#x1f308; 个人主页&#xff1a;王子玉博客 &#x1f506; 免费专栏&#xff1a;Python基础教程、python常用模块 ❤️ 分享网站&#xff1a; 《Python自学网》&#x1f449;&#x1f449;基础入门到逐步深入 | 适合新手入门到精通 | web开发、爬虫、自动化运维、自动化…

yocto 自动挂载分区(基于stmp32mp1)

yocto 自动挂载分区&#xff08;基于stmp32mp1&#xff09; 上一章我们在stm32mp1开发板上实践了创建分区的过程&#xff0c;本节我们再来分析下上小节创建的分区开机时是怎么完成分区的自动挂载的。 答案就在systemd里面&#xff1a; 下面就来详细分析一下这个几个文件 mo…

C/C++入门003-C语言变量与运算符

文章目录变量常量的概念常量的类型变量的概念定义变量为什么要定义变量如何使用变量&#xff1f;变量初始化修改变量变量之间的值传递如何查看变量的值?变量的作用域printf函数scanf函数函数的参数运算符算数运算符赋值运算符sizeof运算符逗号运算符关系运算符逻辑运算符三目运…

攻击类型的攻击次数分布

攻击类型分析 2018 年&#xff0c;主要的攻击类型 1 为 SYN Flood&#xff0c;UDP Flood&#xff0c;ACK Flood&#xff0c;HTTP Flood&#xff0c;HTTPS Flood&#xff0c; 这五大类攻击占了总攻击次数的 96&#xff05;&#xff0c;反射类攻击不足 3%。和 2017 年相比&…

【Linux网络编程】select多路复用

文章目录前言如何增强服务端的通信能力Linux的设计哲学文件描述符代码讲解以文件方式操作命令行阻塞函数与非阻塞函数轮询select()代码全貌The End前言 我们上节课讲解了服务端的编程(Linux服务端编程初体验) 本节课要讲的是select 提示&#xff1a;以下是本篇文章正文内容&am…

RocketMQ引发的磁盘预警复盘

RocketMQ引发的磁盘预警复盘前言发现问题排查过程Step 1Step 2Step 3Step 4Step 5Step 6Step 7Step 8Step 9解决方式写在最后前言 一款优秀的中间件&#xff0c;参数的缺省值必然是经过反复验证得出的最优解&#xff0c;勿动&#xff01; 发现问题 某台SaaS服务器磁盘不足发出…

kafka的 __consumer_offsets

Zookeeper不适合大批量的频繁写入操作。Kafka 1.0.2将consumer的位移信息保存在Kafka内部的topic中&#xff0c;即__consumer_offsets主题&#xff0c;并且默认提供了kafka_consumer_groups.sh脚本供用户查看consumer信息。 1、创建topic “tp_test_01” [rootnode1 ~]# kafka…

《Linux运维总结:Centos7.6部署二进制mongodb4.4.8三节点副本集群》

一、Mongodb集群模式 1、三种集群介绍 MongoDB有三种集群部署模式&#xff0c;分别为主从复制&#xff08;Master-Slaver&#xff09;、副本集&#xff08;Replica Set&#xff09;和分片&#xff08;Sharding&#xff09;模式。 1、Master-Slaver 是一种主从副本的模式&#x…

自动驾驶之行人轨迹预测数据集

一、 Real Data ETH: Univ. Hotel;750 pedestrians exhibiting complex interactions UCY: Zara01, Zara02 and Uni.780 pedestrians 单应性矩阵&#xff0c;SLAM中的当用多个不同相机拍摄同一个三维平面需要考虑的矩阵&#xff0c;适应场景为平面情况 商场 这个数据集是用双…

Onvif学习

ONVIF onvif&#xff08;Open Network Video Interface Forum&#xff0c;开放型网络视频接口论坛&#xff09;协议. onvif协议涵盖了设备发现、设备配置、事件、PTZ控制、视频分析和实时流媒体直播功能&#xff0c;以及搜索&#xff0c;回放和录像录音管理功能。 先去看许振…

git 常用操作

Git 是一个分布式版本控制系统&#xff0c;用于项目开发中的版本控制。从本质上来讲Git是一个内容寻址(content-addressable)文件系统&#xff0c;并在此之上提供了一个版本控制系统的用户界面。 Git的核心部分是一个简单的键值对数据库(key-value data store)。 你可以向该数据…

XML配置文件、用来约束XML文档:DTD、Schema(类型更多)

上一章properties作为配置文件的内容好像还没讲&#xff1f; properties相对于XML的缺点&#xff1a;如果要运行多个方法&#xff0c;只能在properties配置文件里等号后面加逗号&#xff08;或指定符号&#xff09;隔开&#xff0c;然后再加值&#xff0c;这样累加下去会导致阅…

基于分布式数据库集群的大数据职位信息统计

目录 任务一&#xff1a; MongoDB 分布式集群关键配置信息截图&#xff08;启动参数文件、初始化参数文件、启动命令等&#xff09; ch0的参数文件配置&#xff1a; ​编辑 ch1的参数文件配置&#xff1a; ​编辑chconfig的参数文件配置&#xff1a; router的参数文件配置…

SpringSecurity整合Oauth2.0

SpringSecurity整合Oauth2.0一、概述与原理1.1 、OAuth2.0 是什么&#xff1f;1.2、OAuth2.0中角色解释1.3、OAuth2.0的4中授权模式1.3.1、授权码模式&#xff08;重点&#xff09;1.3.1.1 原理1.3.1.2 代码1.3.2、密码模式&#xff08;重点&#xff09;1.3.2.1 原理1.3.2.2 代…

开发运维(DevOps)自动化运维与持续交付企业级实战

一、网站部署流程 1、传统网站部署流程 传统的网站部署,大家在运维过程中,网站部署是运维的工作之一,网站部署的流程大致分为: 需求分析—原型设计—开发代码—提交测试—内网部署—确认上线—备份数据—外网更新-最终测试,如果发现外网部署的代码有异常,需要及时回滚…

[附源码]JAVA毕业设计心理健康系统(系统+LW)

[附源码]JAVA毕业设计心理健康系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

网络安全观察报告恶意软件观察

攻击类型分析 2018 年&#xff0c;主要的攻击类型 1 为 SYN Flood&#xff0c;UDP Flood&#xff0c;ACK Flood&#xff0c;HTTP Flood&#xff0c;HTTPS Flood&#xff0c; 这五大类攻击占了总攻击次数的 96&#xff05;&#xff0c;反射类攻击不足 3%。和 2017 年相比&…

使用分页导入的方式把大量数据从mysql导入es

1、首先要有分页功能的代码 如何使用mybatis-plus实现分页&#xff0c;可参考 http://t.csdn.cn/ddnlk 2、要创建feign远程调用模块 可以参考 http://t.csdn.cn/gshFw 3、在feign模块中声明远程调用接口 1.在feign模块中创建一个接口&#xff0c;名字可以是你要调用的服务名&…

指定区域内实现多尺度、多维度2D图形随机填充(如圆、椭圆、多边形)之MATLAB实现

N久之前&#xff0c;咱在公众号中分享了如何用MATLAB实现在指定区域内随机填充圆&#xff0c;并将相关功能封装一个名为randCircle函数里面&#xff0c;其可实现的功能如下&#xff1a; (1) 设定是否允许填充圆相交、相切或独立存在 (2) 指定区域内圆的生成个数 (3) 设定是否允…

[附源码]计算机毕业设计基于vuejs的文创产品销售平台appSpringboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…