CodeForces 1197 D Yet Another Subarray Problem
Posted jyyhh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces 1197 D Yet Another Subarray Problem相关的知识,希望对你有一定的参考价值。
不得不说CF还是很擅长出这种让人第一眼看摸不着头脑然后再想想就发现是个SB题的题的hhh(请自行断句)。
设sum[]为前缀和数组,那么区间 [l,r]的价值为 sum[r] - sum[l-1] - k*上取整([r-(l-1)]/m)。
或者表示 [l+1,r] 的价值更加简洁一些: sum[r] - sum[l] - k*上取整 ((r-l)/m)。
表示的区间是什么并不重要,我们只在乎后者的最大值,当r确定的时候,值只与 sum[l] + k*上取整 ((r-l)/m) 有关。
我们类似扫描线的做法,每次把右扫描线移动一位(r -> r+1),看看会发生什么:
发现所有 (l%m) == (r%m) 的 l 对应的 sum[l] + k*上取整 ((r-l)/m) 都大了 k,并且还多了一个r的值加了进来,其他的l对应的值都没变。
于是我们直接开个%m意义下的同余系数组记录一下每个等价类的最小值即可,维护是O(1),查询 O(m)。
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=300005; ll a[N],mn[10],ans; int n,m,k; inline void solve(const int M) memset(mn,0x7f,sizeof(mn)); mn[0]=k; for(int i=1,j=1;i<=n;j++,i++) ans=max(ans,a[i]-*min_element(mn,mn+M)); if(j>=M) j-=M; mn[j]=min(mn[j],a[i])+k; int main() scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++) scanf("%lld",a+i),a[i]+=a[i-1]; solve(m),printf("%lld\n",ans); return 0;
以上是关于CodeForces 1197 D Yet Another Subarray Problem的主要内容,如果未能解决你的问题,请参考以下文章
codeforces1197D Yet Another Subarray Problem dp
[题解]Yet Another Subarray Problem-DP 思维(codeforces 1197D)
Educational Codeforces Round 88 (Rated for Div. 2) D. Yet Another Yet Another Task
Educational Codeforces Round 88 (Rated for Div. 2) D. Yet Another Yet Another Task
Educational Codeforces Round 76 (Rated for Div. 2) D. Yet Another Monster Killing Problem 贪心
Educational Codeforces Round 46 D. Yet Another Problem On a Subsequence