作业介绍

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
int n,q[N],a[N],m,tail=-1,head=0;
/*
1.判断队列是否为空 tail>=head 队列不为空
2.q[++tail] = x
3.队首出队head++;
4.tail--
*/
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	//i和q[head]距离<=m
	for(int i=1;i<=n;i++){
		while(tail>=head && a[i]<=a[q[tail]])--tail;
		q[++tail] = i;
		while(tail>=head && i-q[head]+1>m)head++;
		if(i>=m)cout<<a[q[head]]<<" ";
	}
	cout<<endl;
	tail=-1,head=0;
	for(int i=1;i<=n;i++){
		while(tail>=head && a[i]>=a[q[tail]])--tail;
		q[++tail] = i;
		while(tail>=head && i-q[head]+1>m)head++;
		if(i>=m)cout<<a[q[head]]<<" ";
	}
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e5+5;
int n,m,a[N],sum[N],f[N];
int q[N],tail=-1,head=0;
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		sum[i] = sum[i-1]+a[i];
	}
	int res = -1e18;
	for(int i=1;i<=n;i++){
		//1.队尾入队,sum[i-1]<=sum[q[tail]
		while(tail>=head && sum[i-1]<=sum[q[tail]])--tail;
		q[++tail] = i-1;
		//2.队首出队 q[head]<i-m
		while(tail>=head && q[head]<i-m)++head;
		int j = q[head];
		f[i] = sum[i]-sum[j];
		res = max(res,f[i]);
	}
	cout<<res<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int n,a[N],f[N],m;
int q[N],tail=-1,head=0;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		while(tail>=head && f[i-1]<=f[q[tail]])tail--;
		q[++tail] = i-1;
		while(tail>=head && q[head]<i-m)head++;
		int j = q[head];
		f[i] = f[j]+a[i];
	}
	int res = 1e9;
	for(int i=n-m+1;i<=n;i++){
		res = min(res,f[i]);
	}
	cout<<res<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5+5;
int n,a[N],sum[N],f[N],m;
int tail=-1,head=0,q[N];
signed main(){
	cin>>n>>m;n++;
	for(int i=2;i<=n;i++){
		cin>>a[i];
		sum[i] = sum[i-1]+a[i];
	}
	int res = 0;
	q[++tail] = 1;
	for(int i=2;i<=n;i++){
		while(tail>=head && f[i-1]-sum[i]>=f[q[tail]-1]-sum[q[tail]])tail--;
		q[++tail] = i;
		while(tail>=head && q[head]<i-m)head++;
		int j = q[head];
		f[i] = sum[i]+f[j-1]-sum[j];
	//	cout<<i<<" "<<f[i]<<endl;
	}
	cout<<f[n]<<endl;
	return 0;
}

题目

认领作业后才可以查看作业内容。
状态
正在进行…
题目
16
开始时间
2026-4-14 0:00
截止时间
2026-4-22 23:59
可延期
24 小时