D. Yet Another Subarray Problem 思维 难

D. Yet Another Subarray Problem

这个题目很难,我比赛没有想出来,赛后又看了很久别人的代码才理解。

这个题目他们差不多是用一个滑动窗口同时枚举左端点和右端点,具体如下:

首先枚举0~m,这个是说更新的位置,如果是1 当m==3 就更新1 4 7 10...

如果是2,当m==3 就更新 2 6 8 11....

最后都会被更新的。

核心代码

 for (int j = 0; j < n - i; ++j) {
     s += sum[j];
     if (j % m == 0) s -= k;//这个在判断是不是经过了一个区间,如果经过了就-k
     ans = max(ans, s - MIN);//这个是在判断这个时候枚举的区间左端点和区间右端点是不是可以更新答案
     if (j % m == m - 1) MIN = min(MIN, s);//这个就是在更新区间左端点,只有特定的时刻才可以更新,
    //只有在区间左端点才可以,因为我要更新的是下一个区间的右端点,如果提前更新了,那么就会被提前用,可能更新不该更新的东西。
    //左端点是由s来更新的,所以不需要考虑k的问题,
    //这个左端点只有特定时候才可以更新,因为我们枚举了每一个区间为m的起点,意思就是说我们确定了每一个区间
    //当j%m==m-1就是说到了区间的右端点,只有这个时候才可以更新,因为这个时候和我们想更新的是下一个区间的右端点,
    //所以这个才满足两点之间相隔了若干个k,这样子就可以一 前缀相减+k的个数相减*k。
 }

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 3e5 + 10;
typedef long long ll;
ll n, m, ans, k, a[maxn], sum[maxn];

int main()
{
    ans = 0;
    scanf("%lld%lld%lld", &n, &m, &k);
    for (int i = 0; i < n; i++) scanf("%lld", &a[i]);
    for(int i=0;i<m;i++)//枚举第一个区间的起点
    {
        for (int j = i; j < n; j++) sum[j - i] = a[j];
        ll mins = 0, s = 0;
        for(int j=0;j<n-i;j++)
        {
            s += sum[j];
            if (j%m == 0) s -= k;
            ans = max(ans, s - mins);
            if (j%m == m - 1) mins = min(mins, s);
        }
    }
    printf("%lld\n", ans);
}

原文地址:https://www.cnblogs.com/EchoZQN/p/11230583.html

时间: 2024-08-30 10:27:24

D. Yet Another Subarray Problem 思维 难的相关文章

zoj3798Abs Problem(思维)

题目链接: huangjing 题目意思: 用1~n中的数字进行组合,得到后面减前面的一项的最大最小值... 思路: 多试两个就会发现从n到1的排列得到的是最小值,同理从n-1到1得到的也是最小值,那么用n-这个最小值,那么必定得到的是最大值... 题目: Abs Problem Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge Alice and Bob is playing a game, and thi

FZU - 2038 -E - Another Postman Problem (思维+递归+回溯)

Chinese Postman Problem is a very famous hard problem in graph theory. The problem is to find a shortest closed path or circuit that visits every edge of a (connected) undirected graph. When the graph has an Eulerian Circuit (a closed walk that cover

codeforces 1197D-Yet Another Subarray Problem

传送门:QAQQAQ 题意:给你一个序列,求一个子序列a[l]~a[r]使得该子序列的sum(l,r)-k*(r-l+1+m+1)/m值是在所有子序列中最大的,并输出最大值 思路:比赛的时候使用O(n)写的,但是被hack了,因为O(n)无法记录当前距离下一次-k还有多少,若用单调队列维护也不知道前面应该弹出多少(可能现在把前面弹出是最优的,但是到后面可能因为个数还没到m的倍数,把前面加进去又是最优的),所以我们考虑再加一维 法一:dp[i][j]表示序列到i截止,这一轮已经进行了j次取数(j=

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) 有关. 我

Codeforces A. Sweet Problem(思维题)

传送门 题意: 有红,绿,蓝三种颜色的糖各r,g,b个,每天要吃两个糖且颜色不同,问最多能吃多少天 思路: 先把r,g,b排序,从小到大为a,b,c如果a+b<=c,结果肯定输出a+b 否则输出(a+b+c)/2 原因:为了使天数最多,每次取最多和次多的两堆,当次多的变成和最少的相等时,把最多的那个平分个最少和中间那一堆,(如果最多的为奇数,那么总共还剩一个,如果为偶数,所有糖果用完),所以说最优解剩下的糖果不超过两个(a+b>c时) 代码 #include <iostream>

[Algorithm] Maximum Contiguous Subarray algorithm implementation using TypeScript / JavaScript

The maximum subarray problem is one of the nicest examples of dynamic programming application. In this lesson we cover an example of how this problem might be presented and what your chain of thought should be to tackle this problem efficiently. /**

[Algorithm] 如何正确撸&lt;算法导论&gt;CLRS

其实算法本身不难,第一遍可以只看伪代码和算法思路.如果想进一步理解的话,第三章那些标记法是非常重要的,就算要花费大量时间才能理解,也不要马马虎虎略过.因为以后的每一章,讲完算法就是这样的分析,精通的话,很快就读完了.你所说的证明和推导大概也都是在第三章介绍了,可以回过头再认真看几遍. 至于课后题,比较难,我只做了前几章,如果要做完需要更多时间和精力.这可以通过之后做算法题来弥补,可以去leetcode等网站找一些经典的算法题做一做,加深理解. Facebook的工程师写的攻略,介绍了用算法导论来

2015年P2P十大趋势预测

我们认为,2015年,P2P行业将呈紧缩趋势,战国时代之后的整合并购,会越来越多.而P2P行业的机会,就在于产业.所以,2015年,"蓬勃发展,逐鹿产业",这是2015P2P的关键词. 一.2015"风控年",平台跑路将持续不断,行业加速洗牌. 2014年末,P2P行业再次出现新一轮倒闭潮,资金链断裂.提现困难.借款项目逾期等情况再次上演.我们认为,2015年,P2P行业的整体经营风险将居高不下,逾期.跑路等现象持续蔓延,行业洗牌加速. 2014年,P2P风险爆发集

[笔记]Learning to Rank算法介绍:RankSVM 和 IR SVM

之前的博客:http://www.cnblogs.com/bentuwuying/p/6681943.html中简单介绍了Learning to Rank的基本原理,也讲到了Learning to Rank的几类常用的方法:pointwise,pairwise,listwise.这篇博客就很多公司在实际中通常使用的pairwise的方法进行介绍,首先我们介绍相对简单的 RankSVM 和 IR SVM. 1. RankSVM RankSVM的基本思想是,将排序问题转化为pairwise的分类问题