100200F Think Positive
题目大意
给你一个数n和长度为n的序列,序列中的每个数均为1或-1,如果一个点j对于任意的k都满足题目中给的式子,则j是一个合法位置,问这样的j有多少个
分析
这道题有两种方法,分别对应代码1和代码2。
方法1
我们发现最终答案实际就是这n个数的和与0去最大值,因为我们不难发现对于任意两个相邻的1和-1它们的存在是没有意义的,因为这两个位置肯定不合法,而它们的和为0,对其它位置没有影响。所以在得到这些后我们只需把相邻的1和-1不断删掉就行了,因此可以证明之前的猜想。
方法2
我们发现对于每个j对应的最坏情况的k只有图1和图2两种情况,所以只要这两种情况满足且j的后缀大于0这个j就是合法的。
图1
图2
这里的maxsur和minpre都是对于k的取值范围内的min或max,这就不由让我们想起了单调队列。我们根据sur和pre各建一个单调队列,然后用数组记录某个点是否两种情况均满足就可以了,注意在计算时的顺序问题,详见代码。
代码1
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("positive.in","r",stdin);
freopen("positive.out","w",stdout);
int n,i,ans=;
cin>>n;
for(i=;i<=n;i++){
int x;
cin>>x;
ans+=x;
}
if(ans>=)cout<<ans<<endl;
else cout<<<<endl;
return ;
}
代码2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
int pre[],sur[],qp[],qs[],lp,rp,ls,rs,a[];
int p1[],p2[],is[];
inline void init(){
memset(pre,,sizeof(pre));
memset(sur,,sizeof(sur));
memset(qp,,sizeof(qp));
memset(qs,,sizeof(qs));
memset(is,,sizeof(is));
lp=ls=;
rp=rs=;
}
int main(){
freopen("positive.in","r",stdin);
freopen("positive.out","w",stdout);
int n,i,ans=;
init();
scanf("%d",&n);
for(i=;i<=n;i++){
scanf("%d",&a[i]);
pre[i]=pre[i-]+a[i];
}
for(i=n;i>;i--)sur[i]=sur[i+]+a[i];
for(i=n;i>;i--){
while(pre[i]<qp[rp]&&rp>){
rp--;
}
qp[++rp]=pre[i];
p1[rp]=i;
}
for(i=;i<=n;i++){
while(sur[i]>qs[rs]&&rs>){
rs--;
}
qs[++rs]=sur[i];
p2[rs]=i;
}
for(i=;i<=n;i++){
while(p2[ls]<=i&&ls<=rs)ls++;
if(ls>rs){
if(sur[i]>)is[i]++;
continue;
}
if(sur[i]-qs[ls]>)is[i]++;
}
for(i=n;i>;i--){
while(p1[lp]>=i&&lp<=rp)lp++;
if(lp>rp){
if(sur[i]>)is[i]++;
continue;
}
if(sur[i]+qp[lp]>)is[i]++;
}
for(i=;i<=n;i++)
if(sur[i]>&&is[i]==)
ans++;
cout<<ans<<endl;
return ;
}
100200F Think Positive的更多相关文章
- [LeetCode] First Missing Positive 首个缺失的正数
Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2,0] ...
- Leetcode First Missing Positive
Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2,0] ...
- Interleaving Positive and Negative Numbers
Given an array with positive and negative integers. Re-range it to interleaving with positive and ne ...
- 【leetcode】First Missing Positive
First Missing Positive Given an unsorted integer array, find the first missing positive integer. For ...
- 【leetcode】First Missing Positive(hard) ☆
Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2,0] ...
- LeetCode - 41. First Missing Positive
41. First Missing Positive Problem's Link ---------------------------------------------------------- ...
- LeetCode题解-----First Missing Positive
Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2,0] ...
- hdu 5183. Negative and Positive (哈希表)
Negative and Positive (NP) Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Ja ...
- Java for LeetCode 041 First Missing Positive
Given an unsorted integer array, find the first missing positive integer. For example, Given [1,2,0] ...
随机推荐
- 剑指offer--16.数组中重复的数字
时间限制:1秒 空间限制:32768K 热度指数:198342 本题知识点: 数组 题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复 ...
- spring学习-2
Spring_属性配置细节 1.若字面值包含特殊字符,可以使用<[CDATA[]]>把字面值包裹起来 例:<value><![CDATA[<3333>^]]& ...
- javascript网页复制功能-复制到粘贴板-兼容多数浏览器(不使用flash)
使用方法:clipBordCopy("hello Copy");//执行后复制hello Copy到粘贴板 通过 var result = clipBordCopy("h ...
- 如何加快Json 序列化?有哪些方法?
1.使用阿里的fastjson 2.可以通过去除不必要属性加快序列化.如person对象,有id,name,address,我json需要用户姓名,此时序列化的时候就只序列化name,id和addre ...
- java实现sendemail
<dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</arti ...
- BZOJ2096:[POI2010]Pilots
浅谈队列:https://www.cnblogs.com/AKMer/p/10314965.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?i ...
- dockerfile mysql
FROM centos6.6-mysql5.5:0.0.4 MAINTAINER syberos:wangmo RUN mv /etc/my.cnf /etc/my.cnf.bak ADD my.cn ...
- FMDB是iOS平台的SQLite数据库框架
1.FMDB简介 什么是FMDBFMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 为什么使用FMDB使用起来更加面向对象,省去了很多麻烦.冗余的C语言 ...
- 创建github怎样管理
创建版本库 第一步: 创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录 $mkdir learngit $cd learngit $pwd mkdir learngit 创建一个名叫“ ...
- Cypress USB3014 controlEndPoint 使用事项
control endpoint 发送,接收数据 返回fasle , lastError = 997, 抓包查看 Control Transfer (UP) XXXXXXXXX 1. Device: ...