唉,被题目坑了。还以为题目好心提醒是二分。比赛时一直找二分条件,mmm一直找不出。(我真是个憨憨)
最后几分钟,突然搞明白,不用二分。:-(;看题目,首先暴力枚举,怎么暴力??对于每个int型范围内的整数,都有可能。那么枚举每个数,判断最多符合条件的。这是最初的思路,当然暴力过不了;
想怎么优化,我们想知道对于每个数,其符合条件的个数k;
例如:
5 . 则整数5 +1
6 + 则整数大于6的所有数 +1
5 . 5 +1
8 - 小于8的所有数+1
序列上操作,那么差分可以满足;(入门课里讲了)
#include<bits/stdc++.h> using namespace std; const int inf=INT_MAX;//int型数据最大值,因为是对每个数进行统计 int n,a[1000000],max1=0,sum[10000000]; map<int,int> M;//数据过大,数组存不下,并且数据还可为负 char s[1000000]; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]>>s[i]; } for(int i=1;i<=n;i++) { if(s[i]=='.') {M[a[i]]++,M[a[i]+1]--;} if(s[i]=='+'){M[a[i]]--,M[-inf]++;} if(s[i]=='-'){M[inf]--,M[a[i]+1]++;} } int ans=-inf,h=0; for(auto x:M) { h+=x.second; ans=max(h,ans); } cout<<ans; }