[51NOD1065] 最小正子段和(STL,前缀和)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1065
估计没人这么做吧…用一个set维护前缀和,但是set的lower_bound和upper_bound都是返回不小于x的最小值,这就很尴尬了。
#include <bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds; typedef long long LL;
typedef struct F {
LL v;
F() {}
F(LL v) : v(v) {}
bool operator<(const F &x) const {
return v > x.v;
}
}F;
const int maxn = * ;
int n;
int a[maxn];
LL s[maxn];
set<F> v; int main() {
//freopen("in", "r", stdin);
while(~scanf("%d", &n)) {
memset(s, , sizeof(s));
v.clear(); v.insert(s[]);
LL ret = (LL) << ;
for(int i = ; i <= n; i++) {
scanf("%d", &a[i]);
s[i] = s[i-] + a[i];
if(a[i] >= ) ret = min(ret, (LL)a[i]);
if(s[i] >= ) ret = min(ret, s[i]);
F tmp = *v.lower_bound(s[i]);
if(s[i] - tmp.v >= ) {
ret = min(ret, s[i]-tmp.v);
}
v.insert(F(s[i]));
}
cout << ret << endl;
}
return ;
}
噗,直接在set后面加一个greater就好。。
#include <bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds; typedef long long LL;
const int maxn = * ;
int n;
int a[maxn];
LL s[maxn];
set<LL, greater<LL> > v; int main() {
//freopen("in", "r", stdin);
while(~scanf("%d", &n)) {
memset(s, , sizeof(s));
v.clear(); v.insert(s[]);
LL ret = (LL) << ;
for(int i = ; i <= n; i++) {
scanf("%d", &a[i]);
s[i] = s[i-] + a[i];
if(a[i] >= ) ret = min(ret, (LL)a[i]);
if(s[i] >= ) ret = min(ret, s[i]);
LL tmp = *v.upper_bound(s[i]);
if(s[i]-tmp >= ) {
ret = min(ret, s[i]-tmp);
}
v.insert(s[i]);
}
cout << ret << endl;
}
return ;
}
[51NOD1065] 最小正子段和(STL,前缀和)的更多相关文章
- 51nod-1065 最小正子段和 【贪心 + 思维】
N个整数组成的序列a[1],a[2],a[3],-,a[n],从中选出一个子序列(a[i],a[i+1],-a[j]),使这个子序列的和>0,并且这个和是所有和>0的子序列中最小的. 例如 ...
- [51nod1065]最小正子段和
题意:求一个序列中大于0的最小子段和. 解题关键: 先求出前缀和和,对于每个位置求某个位置到当前位置和大于1的和的最小值.然而这是复杂度是O(n^2)的.其实可以通过排序优化到O(nlogn).对前缀 ...
- 51nod-1065:最小正子段和(STL)
N个整数组成的序列a11,a22,a33,…,ann,从中选出一个子序列(aii,ai+1i+1,…ajj),使这个子序列的和>0,并且这个和是所有和>0的子序列中最小的. 例如:4,-1 ...
- 51nod 1065 最小正子段和
题目链接:51nod 1065 最小正子段和 房教说用前缀和做,然后看了别人博客懂了后就感觉,这个真有意思... #include<cstdio> #include<cstring& ...
- 51nod 1065:最小正子段和
1065 最小正子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 取消关注 N个整数组成的序列a[1],a[2],a[3],-,a[n],从中选出一 ...
- AC日记——最小正子段和 51nod 1065
最小正子段和 思路: 找最小的大于0的sum[j]-sum[i](j>i): 高级数据结构(splay)水过: 来,上代码: #include <cstdio> #include & ...
- 【zznu-2060】 Minsum Plus(最小正子段和)
题目描述 题意简单到令人发指! 序列A由N个整数组成,从中选出一个连续的子序列,使得这个子序列的和为正数,且和为所有和大于零的子序列中的最小值. 将这个值输出,若无解,输出no solution. 输 ...
- 51nod 1065 最小正子段和 (贪心)
题目:传送门. 题意:中文题. 题解:求前缀和,并且标记每个数的下标,按照前缀和大小进行从小到大排序.随后进行遍历,如果满足下标data[i-1].id<data[i].id&& ...
- 51Node 1065----最小正子段和
51Node 1065----最小正子段和 N个整数组成的序列a[1],a[2],a[3],…,a[n],从中选出一个子序列(a[i],a[i+1],…a[j]),使这个子序列的和>0,并且这 ...
随机推荐
- C++代码段六
摘自<Primer Plus>浮点数优缺点: void test109() { float a=2.34E+22f; float b=a+1.0f; cout<<"a ...
- springmvc简述
Spring Web MVC 是一种基于 Java 的实现了 Web MVC 设计模式的请求驱动类型的轻量级 Web 框架,即使用了 MVC 架构模式的思想,将 web 层进行职责解耦,基于请求驱动指 ...
- 在线白板,基于socket.io的多人在线协作工具
首发:个人博客,更新&纠错&回复 是昨天这篇博文留的尾巴,socket.io库的使用练习,成品地址在这里. 代码已经上传到github,传送门.可以开俩浏览器看效果. 现实意义是俩人在 ...
- django view使用学习记录
判断用户是否登录 request.user.is_authenticated()auth.authenticate(username=username, password=password)
- asp显示多条记录的代码
asp显示多条记录的代码 仅供参考 <%for i=1 to RS.PageSize%> <% if RS.EOF then exit for end if %> <tr ...
- ansible
3.1 配置 #vim /etc/ansible/hosts //定义主机,支持IP和域名,支持分组 [local] 127.0.0.1 [nginx] 192.168.0.10 ...
- BlueDroid介绍 【转】
转自:http://blog.csdn.net/fen_liu/article/details/41213167 [-] 基本结构 代码区 http://www.cnblogs.com/hzl6255 ...
- [转]vs2008安装失败的总结与分享
转自:http://www.cnblogs.com/rockdean/archive/2010/01/13/1646851.html 今天系统是刚装的,今儿个也不是第一次装系统,也不是第一次装vs20 ...
- [转]clrDateTime to Dynamics AX TransDate
转自:https://community.dynamics.com/ax/f/33/t/30791.aspx TransDate是一种只有日期,没有时间的类型 utcDateTime=Global:: ...
- 身为运维工程师怎么用Nginx部署DokuWiki
运维人员按区域组织,人员分散,集中培训成本比较高: 新入职运维人员除了培训手册,没有其它渠道可以持续深入了解公司产品: 运维人员的知识存在各自脑袋里,缺少有效的渠道来传播和分享: 运维知识体系需要积累 ...