站外题求助
  • 板块题目总版
  • 楼主xiaoshumiao
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/18 14:43
  • 上次更新2023/12/18 19:47:55
查看原帖
站外题求助
1008513
xiaoshumiao楼主2023/12/18 14:43

题目链接

想到了如果设 sumsum 为前缀和数组的话,答案为

max⁡1≤i≤N{sumi−min⁡0≤j<i,P≤∣i−j+1∣≤Q{sumj}}\max\limits_{1 \le i \le N}\{sum_i-\min\limits_{0 \le j < i,P \le \left|i-j+1\right| \le Q}\{sum_j\}\}

然后用单调队列计算 min⁡0≤j<i,P≤∣i−j+1∣≤Q{sumj}\min\limits_{0 \le j < i,P \le \left|i-j+1\right| \le Q}\{sum_j\}。但样例输出 −8-8,求调。

#include<cstdio>
#include<deque>
using namespace std;
const int MAXN=100005;
int a[MAXN],sum[MAXN];
int main() {
  //freopen("vacation.in","r",stdin);
  //freopen("vacation.out","w",stdout);
  int n,p,q;
  scanf("%d %d %d",&n,&p,&q);
  for(int i=1;i<=n;i++) {
  	scanf("%d",&a[i]);
  	sum[i]=sum[i-1]+a[i];
  }
  int ans=-100000000,k=q-p+1;
  deque<int>que;
  for(int i=1;i<=n;i++) {
  	while(!que.empty()) {
  	  if(sum[i]>sum[que.back()])
  	    que.pop_back();
  	  else
  	    break;
  	}
  	que.push_back(i);
  	while(i-que.front()>=k)
  	  que.pop_front();
  	if(i>=k&&ans<sum[que.front()])
  	  ans=sum[que.front()];
  }
  printf("%d",ans);
  return 0;
}
2023/12/18 14:43
加载中...