4.2沟里学姐的残忍

就是找一定范围内,和最大的区间
解题,一种用区间最值的方法,先开一个前缀和数组,然后从每一个点开始找后面一定范围内的区间最大值,然后比较找出最大的就好了

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <iomanip>
#include<cmath>
#include<float.h> 
#include<string.h>
#include<algorithm>
#define sf scanf
#define scf(x) scanf("%d",&x)
#define scff(x,y) scanf("%d%d",&x,&y) 
#define pf printf
#define prf(x) printf("%d
",x)
#define mm(x,b) memset((x),(b),sizeof(x))
#include<vector>
#include<queue>
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
typedef long long ll;
const ll mod=1e9+100;
const double eps=1e-8;
using namespace std;
const double pi=acos(-1.0);
const int inf=0xfffffff;
const int N=1e5+7;
int a[N],sum[N];
int dpmax[N][20];
void first(int n)
{
    mm(dpmax,0);
    rep(i,1,n+1)
    {
       dpmax[i][0]=sum[i];
    }
    for(int j=1;(1<<j)<=n;j++)
    {
        for(int i=1;i+(1<<j)-1<=n;i++)
        {
            dpmax[i][j]=max(dpmax[i][j-1],dpmax[i+(1<<(j-1))][j-1]);
        }
    }
}
int fmax(int l,int r)
{
    int x=0;
    while(l-1+(1<<x)<=r) x++;
    x--;
    return max(dpmax[l][x],dpmax[r-(1<<x)+1][x]);
}
int main()
{
//	freopen("input.txt","r",stdin);
	int n,k;int maxx=-inf,l,r;
	sum[0]=0;
	scff(n,k);
	rep(i,1,n+1)
	{
		scf(a[i]);
		sum[i]=sum[i-1]+a[i];
	}
	first(n);
	int right;
	rep(i,1,n)
	{
		if(n<i+k-1)
			right=n;
		else
			right=i+k-1;
		if(fmax(i,right)-sum[i-1]>maxx)
		{
			maxx=fmax(i,right)-sum[i-1];
			l=i;
		}
	}
	if(maxx<a[n])
	{
		pf("%d %d %d",maxx,n,n);
		return 0;
	}
	rep(i,l,n+1)
	{
		if(sum[i]-sum[l-1]==maxx)
		{
			r=i;
			break;
		}
	}
	pf("%d %d %d",maxx,l,r);
	return 0;
}

第二种蛮看一下

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <iomanip>
#include<cmath>
#include<float.h> 
#include<string.h>
#include<algorithm>
#define sf scanf
#define scf(x) scanf("%d",&x)
#define scff(x,y) scanf("%d%d",&x,&y) 
#define pf printf
#define prf(x) printf("%d
",x)
#define mm(x,b) memset((x),(b),sizeof(x))
#include<vector>
#include<queue>
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
typedef long long ll;
const ll mod=1e9+100;
const double eps=1e-8;
using namespace std;
const double pi=acos(-1.0);
const int inf=0xfffffff;
const int N=1e5+7;
struct node
{
	int sum;
	int id;
	bool friend operator < (node a,node b)
	{
		if(a.sum==b.sum) return a.id>b.id;
		return a.sum>b.sum;
		
	}
}a[N];
priority_queue<node> v;
int main()
{
	int n,k,x,maxx,l=1,r=1;
	a[0].sum=0;
	a[0].id=0;
	v.push(a[0]);
	scff(n,k);
	rep(i,1,n+1)
	{
		scf(x);
		a[i].id=i;
		a[i].sum+=a[i-1].sum+x;
	}
	maxx=a[1].sum;
	v.push(a[1]);
	node t;
	rep(i,2,n+1)
	{
		while(!v.empty())
		{
			t=v.top();
			if(i-t.id<=k) break;
			else v.pop();
		}
		if(a[i].sum-t.sum>maxx)
		{
			maxx=a[i].sum-t.sum;
			l=t.id+1;
			r=a[i].id;
		} 
		v.push(a[i]);
	}
	pf("%d %d %d
",maxx,l,r);
}
原文地址:https://www.cnblogs.com/wzl19981116/p/10087212.html