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 环状最大两段子段和的更多相关文章

  1. 洛谷 P1121 环状最大两段子段和 解题报告

    P1121 环状最大两段子段和 题目描述 给出一段环状序列,即认为\(A_1\)和\(A_N\)是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 第一行是一个正整数 ...

  2. 洛谷P1121 环状最大两段子段和

    题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的第一行是一个正整数N,表示了序列 ...

  3. 洛谷 P1121 环状最大两段子段和 题解

    每日一题 day57 打卡 Analysis 对于这个问题,由于分成了两个子序列,我们不妨就是枚举一下可能出现的情况: 无非就这两种: 1.+++++0000+++++0000++++ 2.0000+ ...

  4. P1121 环状最大两段子段和

    P1121 环状最大两段子段和 题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件maxsum2.in的 ...

  5. P1121 环状最大两段子段和(DP)

    P1121 环状最大两段子段和 难度 提高+/省选- 题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件 ...

  6. luogu P1121 环状最大两段子段和

    嘟嘟嘟 一道说难也难说简单也简单的dp题. 我觉得我的(有篇题解)做法就属于特别简单的. 平时遇到环的问题都是断环为链,但这道题给了一种新的思路. 观察一下,最后的答案无非就这两种:xxx--xx-- ...

  7. 【u124】环状最大两段子段和

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. ...

  8. luogu 1121 环状最大两段子段和

    题目大意: 一个序列看做一个环 选两段数使它们和最大 思路: 定义一个dp数组i j 0/1 表示前i个取了连续的j段 0/1表示取不取第i个 但是因为看做一个环 首尾相接的情况可以看做是选三段,其中 ...

  9. Luogu1121:环状最大两段子段和

    题面 传送门 Sol 两种情况 第一种就是类似\(***000***000***(0表示选)\),这个可以DP 设\(h[0/1/2/3][i]\)表示到第\(i\)位的状态: \(0\):表示还没选 ...

随机推荐

  1. 创建一个catkin工作空间

    先确定自己的环境变量是否设置正确 export | grep ROS 若出现如下的,说明是正确的 declare -x ROSLISP_PACKAGE_DIRECTORIES="" ...

  2. MySQL学习笔记(六)—— MySQL自连接

    有的时候我们需要对同一表中的数据进行多次检索,这个时候我们可以使用之前学习过的子查询,先查询出需要的数据,再进行一次检索. 例如:一张products表,有产品id,供应商id(vend_id),产品 ...

  3. Ubuntu安装基础教程

    作者:TeliuTe 来源:基础教程网 二十三.安装Ubuntu14.04 返回目录 下一课 14.04 版安装与前面版本类似,学习中遇到不清楚的地方,可以参考一下前面的内容,操作中注意细心,下面来看 ...

  4. Django_model基础

    Django-model基础   ORM 映射关系: 表名 <-------> 类名 字段 <-------> 属性 表记录 <------->类实例对象 创建表( ...

  5. html5--3.22 综合实例03

    html5--3.22 综合实例03 学习要点 通过一个综合实例来回顾学过的内容 这一章的内容比较多,不必强求一下子全记住,多做一些练习,用得多了自然就可以记住了 可以自己找一些实例练练手,比如各网站 ...

  6. Android终端管理器删除文件夹

    终端管理器删除文件夹不能用网上提供的: rm -rf 文件夹名 而要用: rm -r 文件夹名. http://blog.csdn.net/enhancing/article/details/8490 ...

  7. Oracle数据常用操作

    将用逗号隔开字段拆分成两行: select * from mp_fs_file_info a,dm_process_upload b where instr(b.attachment,a.file_i ...

  8. map插入与查找

    用map构建映射关系可以用来离散化,这里记录一下用法: 插入:将要插入的两个值组成pair,用insert插入map中: 查找:定义iterator,赋成find返回的迭代器,如果没有找到则=mp.e ...

  9. web.xml中load-on-startup的作用,web应用写一个InitServlet,这个servlet配置为启动时装载

    如下一段配置,熟悉DWR的再熟悉不过了:<servlet>   <servlet-name>dwr-invoker</servlet-name>   <ser ...

  10. Zeppelin推荐

    1.官网 Zeppelin官网,我们可以通过官网了解并获取Zeppelin,Zeppelin既有编译好可以直接运行的文件:也有源码文件. 官网下载网址 http://zeppelin.apache.o ...