洛谷 P1121 环状最大两段子段和
https://www.luogu.org/problemnew/show/P1121
不会做啊。。。
看题解讲的:
答案的两段可能有两种情况:一是同时包含第1和第n个,2是不同时包含第1和第n个
对于第二种可以先求出f[i],g[i]分别表示1..i和i..n的最大子段和,然后枚举断点解决
对于第一种可以转化成找到“序列上最小两段字段和“去掉,这可以用第二种的方法解决;不过注意这个”序列上最小两段字段和“长度必须<=n-2(因为要剩下至少2个元素),需要一些特判
另外,话说此题居然还能用线段树维护...
(然而数据弱,仍然不知道以下代码是不是对的)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define fi first
#define se second
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
#define int ll
struct pii
{
int fi,se;
pii():fi(),se(){}
pii(int a,int b):fi(a),se(b){}
};
pii max1(const pii &a,const pii &b)
{
return (a.fi<b.fi||(a.fi==b.fi&&a.se>b.se))?b:a;
}
pii min1(const pii &a,const pii &b)
{
return (a.fi<b.fi||(a.fi==b.fi&&a.se<b.se))?a:b;
}
int a[];
pii f1[],g1[],f2[],g2[];
int n,a1,a2,sum;
int calc(int p)
{
if(p==)
{
return g2[].se==n- ? g2[].fi-max(a[],a[n]) : g2[].fi;
}
else if(p==n)
{
return f2[n-].se==n- ? f2[n-].fi-max(a[],a[n-])
: f2[n-].fi;
}
else
{
return f2[p-].se+g2[p+].se==n-
? f2[p-].fi+g2[p+].fi - max(max(a[],a[p-]),
max(a[p+],a[n]))
: f2[p-].fi+g2[p+].fi;
}
}
signed main()
{
int i;pii t;
scanf("%lld",&n);
if(n<=) exit(-);
for(i=;i<=n;++i)
{
scanf("%lld",&a[i]);
sum+=a[i];
}
f1[]=pii(a[],);
t=pii(a[],);
if(t.fi<=) t=pii(,);
for(i=;i<=n;++i)
{
t.fi+=a[i];++t.se;
f1[i]=max1(f1[i-],t);
if(t.fi<=) t=pii(,);
}
g1[n]=pii(a[n],);
t=pii(a[n],);
if(t.fi<=) t=pii(,);
for(i=n-;i>=;--i)
{
t.fi+=a[i];++t.se;
g1[i]=max1(g1[i+],t);
if(t.fi<=) t=pii(,);
}
f2[]=pii(a[],);
t=pii(a[],);
if(t.fi>=) t=pii(,);
for(i=;i<=n;++i)
{
t.fi+=a[i];++t.se;
f2[i]=min1(f2[i-],t);
if(t.fi>=) t=pii(,);
}
g2[n]=pii(a[n],);
t=pii(a[n],);
if(t.fi>=) t=pii(,);
for(i=n-;i>=;--i)
{
t.fi+=a[i];++t.se;
g2[i]=min1(g2[i+],t);
if(t.fi>=) t=pii(,);
}
a1=f1[].fi+g1[].fi;
for(i=;i<=n-;++i)
a1=max(a1,f1[i].fi+g1[i+].fi);
a2=calc();
for(i=;i<=n;++i)
a2=min(a2,calc(i));
printf("%lld",max(a1,sum-a2));
return ;
}
洛谷 P1121 环状最大两段子段和的更多相关文章
- 洛谷 P1121 环状最大两段子段和 解题报告
P1121 环状最大两段子段和 题目描述 给出一段环状序列,即认为\(A_1\)和\(A_N\)是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 第一行是一个正整数 ...
- 洛谷P1121 环状最大两段子段和
题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的第一行是一个正整数N,表示了序列 ...
- 洛谷 P1121 环状最大两段子段和 题解
每日一题 day57 打卡 Analysis 对于这个问题,由于分成了两个子序列,我们不妨就是枚举一下可能出现的情况: 无非就这两种: 1.+++++0000+++++0000++++ 2.0000+ ...
- P1121 环状最大两段子段和
P1121 环状最大两段子段和 题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的 ...
- P1121 环状最大两段子段和(DP)
P1121 环状最大两段子段和 难度 提高+/省选- 题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件 ...
- luogu P1121 环状最大两段子段和
嘟嘟嘟 一道说难也难说简单也简单的dp题. 我觉得我的(有篇题解)做法就属于特别简单的. 平时遇到环的问题都是断环为链,但这道题给了一种新的思路. 观察一下,最后的答案无非就这两种:xxx--xx-- ...
- 【u124】环状最大两段子段和
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. ...
- luogu 1121 环状最大两段子段和
题目大意: 一个序列看做一个环 选两段数使它们和最大 思路: 定义一个dp数组i j 0/1 表示前i个取了连续的j段 0/1表示取不取第i个 但是因为看做一个环 首尾相接的情况可以看做是选三段,其中 ...
- Luogu1121:环状最大两段子段和
题面 传送门 Sol 两种情况 第一种就是类似\(***000***000***(0表示选)\),这个可以DP 设\(h[0/1/2/3][i]\)表示到第\(i\)位的状态: \(0\):表示还没选 ...
随机推荐
- Looksery Cup 2015 C. The Game Of Parity —— 博弈
题目链接:http://codeforces.com/problemset/problem/549/C C. The Game Of Parity time limit per test 1 seco ...
- Codeforces Round #304 (Div. 2) C. Soldier and Cards —— 模拟题,队列
题目链接:http://codeforces.com/problemset/problem/546/C 题解: 用两个队列模拟过程就可以了. 特殊的地方是:1.如果等大,那么两张牌都丢弃 : 2.如果 ...
- 一个selenium笔试题——去哪网首页获取符合要求的url并保存
今天在群里看到这样一个笔试题:请使用任何熟悉的面向对象编程语言,编写代码,获取http://www.qyer.com页面中,所有</a>标签"href"属性值包含英文单 ...
- Android Studio中的“favorites”和“bookmark”
做项目难免来回查看某个文件的某个方法,某些文件可能访问率很高, 为了加快开发效率楼主推荐使用favorites (文件)bookmark (代码 行). favorites 的添加就在文件单击右键ad ...
- 看 迪杰斯特拉(Dijsktra)算法体会
迪杰斯特拉 看啊哈算法中迪杰斯特拉算法体会: 算法思路 : 1.先找到源头到其他点的最短路: 2.以最短路作为中转点进行比较,用一个dis数组保存源头到他的最优距离 3.用循环进行最优筛选: #inc ...
- 数据库之Oracle
数据库之Oracle 一. 用户的管理 1. 用户就是好比公司的某个人,而权限是这个人能在公司做什么,他的角色就是说明他的职位. 2. 用户的权限分为: 系统权限:对别的用户的管理操作. 对象权限:对 ...
- npm 引入第三方过滤器
根据项目具体情况使用过滤器,如果不满足业务需求可以在vue的全局或者局部自定义fiter(过滤器) 一下是github提供的第三方过滤器: https://github.com/freearhey/v ...
- ZOJ3201(树形DP)
Tree of Tree Time Limit: 1 Second Memory Limit: 32768 KB You're given a tree with weights of ea ...
- 十张Gif动图让你弄懂递归等概念
图像(包括动图)是传递信息的一种高效方式,往往能增强表象.记忆与思维等方面的反应强度.所谓一图胜千言,说的就是这个道理. 今天为大家整理了十张动图GIFS,有助于认识循环.递归.二分检索等概念的具体运 ...
- 管理SSIS 日志
转自:http://www.cnblogs.com/biwork/p/biworklog.html 一直准备写这么一篇有关 SSIS 日志系统的文章,但是发现很难一次写的很完整.因为这篇文章的内容可扩 ...