AcWing test plan: 0x10 basic data structure - AcWing 135. Maximum sub sequence sum

1. Title Description:

2. Meaning:
Slightly.

3. Ideas:
Monotone queue + prefix and. (look at TTwTT Series) at first glance, this topic thought it was dp, but looking at it carefully, I found that it requires the length to be within m, which is generally a monotonous queue within a certain length or beyond a certain length. We maintain an incremental monotone queue, maintaining prefixes and. Why maintain incremental prefixes and queues? Since we require the maximum sum of a continuous interval, then we maintain the minimum value of the prefix sum. For some intervals, we can directly subtract the minimum value, which is the qualified interval sum! And since it is the minimum value, the value obtained must be the maximum value.
Algorithm idea:
1) We preprocess all prefixes and.
2) For all prefixes in 1-n, put them into the monotone queue. If they are larger than the end of the queue, then update the maximum value -- the end of the queue prefix and the maximum value minus the sum of the first of the queue prefixes.
3) If the difference between the head and the tail is greater than m, pop will drop the head and update the maximum value.
4) Details: a) it is possible that all of them are negative, res is initialized to - inf; b) when the prefix sum of the head team and the tail of the team is within m, its own value should be included; c) when the head team and the tail of the team are the same, it should be noted that the queue of the title must be greater than 1, that is, the head team and the tail of the team cannot be the same number.

4. Code:

//AcWing 135. Maximum sum of subsequences
//#include<bits/stdc++.h>
//#pragma GCC optimize(3,"Ofast","inline")
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
//#include<random>
#include<cstdlib>
#include<ctime>
#include<map>
#include<set>
#include<stack>
#include<queue>
#define FAST ios::sync_with_stdio(false)
#define DEV_RND ((int)rand()*RAND_MAX+rand())
#define RND(L,R) (DEV_RND%((R)-(L)+1)+(L))
#define abs(a) ((a)>=0?(a):-(a))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define mem(a,b) memset(a,b,sizeof(a))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define rep(i,a,n) for(int i=a;i<n;++i)
#define per(i,n,a) for(int i=n-1;i>=a;--i)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define li inline
#define re register
using namespace std;
//typedef uniform_int_distribution<int> RNDI;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef double db;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int Hash = 131;//13331
const int maxn = 3e5+5;
const int maxm = 100000+5;
const int mod = 1e9+7;
const int inf = 0x3f3f3f3f;
const double eps = 1e-7;
const double pi = acos(-1);
//int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
//li int f(int x){return x==par[x]?par[x]:par[x]=f(par[x]);}
//mt19937 eng(time(0));
//li int RND(int L,int R){RNDI rnd(L,R);return rnd(eng);}
li ll lowbit(ll x){return x&(-x);}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){if(!b){d=a,x=1,y=0;}else{ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}}//x=(x%(b/d)+(b/d))%(b/d);
li ll qpow(ll a,ll b,ll MOD=mod){ll res=1;a%=MOD;while(b>0){if(b&1)res=res*a%MOD;a=a*a%MOD;b>>=1;}return res%MOD;}
li ll qmul(ll a,ll b,ll MOD=mod){return (a*b-(ll)((long double)a/MOD*b)*MOD+MOD)%MOD;}
li ll inv(ll x,ll p){return qpow(x,p-2,p);}
li ll jos(ll n,ll k,ll s=1){ll res=0;rep(i,1,n+1) res=(res+k)%i;return (res+s)%n;}
db f(db x){return x;}
li db sim(db l,db r){return (f(l)+4.*f((l+r)/2.)+f(r))*(r-l)/6.;}
db asr(db l,db r,db ans,db eps){db m=l+(r-l)/2.,L=sim(l,m),R=sim(m,r);return fabs(L+R-ans)<=15.*eps?L+R+(L+R-ans)/15.:asr(l,m,L,eps/2)+asr(m,r,R,eps/2);}
db asr(db l,db r,db eps){return asr(l,r,sim(l,r),eps);}
namespace IO
{
	li ll read()
	{
		ll x=0,sign=1;char c=getchar();
		while(c>'9'||c<'0') {if(c=='-') sign=-1;c=getchar();}
		while('0'<=c&&c<='9') x=x*10+c-'0',c=getchar();
		return x*sign;
	}
	template<typename T>
	li void write(T x,char t='\n')
	{
		if(x<0){x=-x;putchar('-');};
		static int sta[25];int top=0;
		do{sta[top++]=x%10;}while(x/=10);
		while(top) putchar(sta[--top]+'0');
		putchar(t);
	}
}
using namespace IO;
/*-------------head-------------*/
//
int n,m;
ll sum[maxn];
deque<int> q;
li void solve()
{
	m=read();
	rep(i,1,n+1) sum[i]=sum[i-1]+read();
	ll res=-inf;
	n++,sum[n]=-inf;
	rep(i,1,n+1)
	{
	    while(sz(q)&&i-q.front()>m)
	    {
	        if(q.front()<=m) res=max(res,sum[q.front()]);
	        if(q.back()!=q.front()) res=max(res,sum[q.back()]-sum[q.front()]);
	        q.pop_front();
	    }
		while(sz(q)&&sum[i]<sum[q.back()])
		{
		    if(q.back()<=m) res=max(res,sum[q.back()]);
		    if(q.back()!=q.front()) res=max(res,sum[q.back()]-sum[q.front()]);
			q.pop_back();
		}
		q.pb(i);
	}
	write(res);
	//puts("");
}
int main()
{
	//srand(time(0));
	//freopen("C:\\Users\\Administrator\\Desktop\\in.txt","r",stdin);
	//for(int QwQ=read();QwQ;QwQ--) solve();
	while(~scanf("%d",&n)) solve();
	return 0;
}

Tags: iOS

Posted on Mon, 15 Jun 2020 22:32:49 -0400 by zimick