P1121 环状最大两段子段和

news/2025/2/15 16:12:18/文章来源:https://www.cnblogs.com/zzzsacmblog/p/18717097

链接

https://www.luogu.com.cn/problem/P1121

题目

思路

这个O(n)的思路很好:https://www.cnblogs.com/kamimxr/p/11438701.html。 关键思路:

答案分两种情况,一种是选择的两段均不跨越n到1(也就是环),另一种是选择的两段跨过了环;

如果均不跨越环,那么也就是意味着这是一道模板题;

设maxl[i]表示从1-i的最大字串和,maxr[i]表示i-n的最大字段和;

很明显的:答案就是max(maxl[i]+maxr[i+1])

maxl[i]=max(a[i],maxl[i-1]+a[i]);//表示这一位是不是一段区间的开头;
maxl[i]=max(maxl[i-1],maxl[i]);
maxr[i]=max(a[i],maxr[i+1]+a[i]);
maxr[i]=max(maxr[i],maxr[i+1]);

然后处理环:
我们换种思维,就好比并查集维护联通时可以运用逆向思维一样,把拆边改为加边,你求1~n带环的最大值就等价于求(1-n的区间和)减去(1-n的两段区间最小值)
补充一个解释:

红色是跨端点连接成一段,那么最终形成的另外两段就只需要求最小值就行了。

代码

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<map>
#include<string.h>
#include<limits.h>
#include<string>
#include<vector>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
#define int long long 
const int N = 2e5 + 10;
int a[N];
int sumn;
int maxl[N], maxr[N], minl[N], minr[N];signed main()
{IOS;int n; cin >> n;int cnt = 0;for (int i = 0; i < n; i++){cin >> a[i]; sumn += a[i];if (a[i] > 0)cnt++;}int ans = 0;if (cnt <= 2){priority_queue<int>pq;for (int i = 0; i < n; i++)pq.push(a[i]);ans += pq.top();pq.pop();ans += pq.top();pq.pop();}else{//注意这里一定要分开求max!!分两步,第一步决定是否是这个数开头,第二步才是对历史信息的综合。如果过早求max会丢失信息for (int i = 0; i < n; i++){if (i == 0)maxl[i] = a[i], minl[i] = a[i];else maxl[i] = max(a[i],  maxl[i - 1] + a[i]), minl[i] = min(a[i],  minl[i - 1] + a[i]);}for (int i = 1; i < n; i++){maxl[i] = max(maxl[i], maxl[i - 1]), minl[i] =  min(minl[i - 1], minl[i] );}for (int i = n - 1; i >= 0; i--){if (i == n - 1)maxr[i] =a[i], minr[i] =a[i];else maxr[i] = max(a[i],maxr[i + 1] + a[i]), minr[i] = min(a[i], minr[i + 1] + a[i]);}for (int i = n - 2; i >= 0; i--){maxr[i] =max(maxr[i + 1], maxr[i]), minr[i] =min(minr[i + 1], minr[i]);}int ansmax = 0, ansmin = LLONG_MAX;for (int i = 0; i + 1 < n; i++)ansmax = max(ansmax,maxl[i] + maxr[i + 1]),ansmin = min(ansmin,minl[i] + minr[i + 1]);ans = ansmax;if (ansmin != LLONG_MAX and sumn - ansmin > ans)ans = sumn - ansmin;}cout << ans;return 0;
}

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

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

相关文章

muduo网络库核心代码阅读(Thread,EventLoopThread,EventLoopThreadPool)(4)

muduo网络库核心设计为one loop one thread,即一个线程一个事件循环。其中,主Reactor负责监听新连接,并将新连接平均分配到从Reactor中,而从Reactor则对分配到其上的用户进行io交互,接收并处理用户发来的数据,包括消息的回复(实际上,在使用中需要手动设置Reactor线程的…

C#生成多尺寸bmp格式ICO图标代码

代码取自deepseek,且已经过本地执行测试 //.cs 文件类型,便于外部编辑时使用 // 引用必要的命名空间 using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Runtime.InteropServices;/…

CTA:回测执行引擎BacktestingEngine

回测执行引擎BacktestingEngine 回顾前面的文章CTA:回测综述,那里提到,真正执行回测的逻辑,写在BacktestingEngine中。 代码解读 BacktestingEngine定义在vnpy_ctastrategy -> backtesting.py中。 package from collections import defaultdict from datetime import da…

CTA:回测快速示例

设置工作目录 VNPY程序启动后,会产生一个工作目录,程序运行产生的数据、系统配置都会放在指定的.vntrader目录当中。 这一设置在vnpy -> utility.py -> _get_trader_dir函数中可以找到,工作目录由TRADER_DIR, TEMP_DIR确定。 def _get_trader_dir(temp_name: str) -&g…

VNPY体系结构

整体架构每个层次的模块只调用下层功能,并对上层提供接口。接口层负责对接行情和交易API,将行情数据推送到系统,发送交易指令。 引擎层向下对接交易接口、数据库,向上服务于各种上层应用。 应用层主要是面向用户的可视化界面,这一部分的代码主要为引擎功能与界面的连接。功…

【ABP】项目示例(2)——聚合根和实体

聚合根和实体 在上一章节中,已经完成了项目搭建的前置准备,在这一章节中,实现领域层的聚合根和实体 创建名称为General.Backend.Domain的标准类库,分别新建名称为Entities、Services、IRepositories和Specifications的文件夹,用于存放实体和聚合根、领域服务、仓储接口和规…

P1896 [SCOI2005] 互不侵犯(状态压缩)

位运算符好麻烦,没打括号被卡了半天 #include<iostream> #define int long long using namespace std; int f[12][100][1<<11]; int s[1<<11]; int num[1<<11]; signed main(){int n,k;cin>>n>>k;int cnt=0;for(int i=0;i<(1<<…

200N03-ASEMI豆浆机专用MOS管200N03

200N03-ASEMI豆浆机专用MOS管200N03编辑:ll 200N03-ASEMI豆浆机专用MOS管200N03 型号:200N03 品牌:ASEMI 封装:TO-252 批号:最新 最大漏源电流:200A 漏源击穿电压:30V RDS(ON)Max:1.8mΩ 引脚数量:3 芯片个数: 沟道类型:N沟道MOS管、中低压MOS管 漏电流:ua 特性:…

第七章-收益归因:Brinson模型

例子 现有一个投资组合,其基准组合为:70%中证800,20%债券,10%现金,如下:基金经理主动投资,对资产权重进行调整。假设基准组合收益率为\(r\)。若是看好股票,那就多配置一些股票,调整中证800权重为\(w_1^{\prime}\)。则收益调整为(\(w_1^{\prime}-w)(r_1-r)\)。会有两种情…

我用GPT干什么

有几天没有更新文章了,一方面因为感觉GPT出来了,写什么都不香了,非得写点关于GPT的才有资格出来和大家见面;另一方面,确实最近一段时间也在全面拥抱GPT:学习,总结,思考。所以今天就想随心所欲地说说GPT使用感受。其实GPT出来没多长时间,就注册账号,并体验了网页版,更…