JZOJ 1844——数数

2024-01-30 11:32
文章标签 jzoj 数数 1844

本文主要是介绍JZOJ 1844——数数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里写图片描述


仍然是预处理sum[i]表示前i个数的和,只枚举右端点r
问题就转换成了在sum[r-k..r-1]中找一个最小值。
那么我们维护一个元素单调递增的队列
每次处理完一个r后把队尾所有不小于sum[r]的元素删掉后把sum[r]放进队尾。那么每次只用把队头中元素在原数组中的下标

代码如下:

#include<algorithm>
#include<cstdio>
#include<cmath>
#include<iostream>
#define MAXN 110000
#define INF 100000009
using namespace std;
long long sum[MAXN];
int q[MAXN];
int n,k,head,tail;
long long ans;
int main()
{scanf("%d%d",&n,&k);ans=-INF;q[0]=0;sum[0]=0;for (int i=1;i<=n;i++){int x;scanf("%d",&x);sum[i]=sum[i-1]+x;while (q[head]<i-k) head++;while (sum[i]<=sum[q[tail]]&&tail>=head)tail--;q[++tail]=i;ans=max(ans,sum[i]-sum[q[head]]);}printf("%lld",ans);return 0;
}

这篇关于JZOJ 1844——数数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/660103

相关文章

Jzoj 条件循环(while,do while) 部分代码(共25题)

1020: 【入门】编程求1+3+5+...+n #include <bits/stdc++.h>using namespace std;int n, sum;int main() {scanf("%d", &n);for(int i=1; i<=n; i+=2){sum+=i;} printf("%d", sum);return 0;} 1012: 【入门】两数比大小 #i

Jzoj 二维数组部分代码(共13题)

2788: 【入门】二维数组的输入输出 边输入边输出 #include <bits/stdc++.h>using namespace std;int n, m, a[11][11];int main(){scanf("%d %d", &n, &m);//边输入边输出for(int i=1; i<=n; ++i){for(int j=1; j<=m; ++j){scanf("%d", &

BZOJ 3530 数数【AC自动机+数位dp】

[Sdoi2014]数数 简单数位dp+简单AC自动机 反正数位DP是队友写的 AC自动机要记录两个值,一个是是否为一个串的结束,即不合法状态,一个是前缀零的情况。 // whn6325689// Mr.Phoebe// http://blog.csdn.net/u013007900#include <algorithm>#include <iostr

NYOJ,198,数数

数数 时间限制:3000 ms  | 内存限制:65535 KB 难度:2 描述 我们平时数数都是喜欢从左向右数的,但是我们的小白同学最近听说德国人数数和我们有些不同,他们正好和我们相反,是从右向左数的。因此当他看到123时会说“321”。 现在有一位德国来的教授在郑州大学进行关于ACM的讲座。现在他聘请你来担任他的助理,他给你一些资料让你找到这些资料在书中的页数。现在你已经找到了对

数数问题

网上看到的一个让人想了好半天,测试了,才知道,有的大括号省略后只能读到当前行, so建议写代码过程中不要省略大括号,这不是个好习惯。 package homework; import java.util.ArrayList; import java.util.Scanner; import java.util.Vector; public class Baoshu

[USACO2003 Dec]Cow Queueing数数的梦 (基础水数位DP带注释!)

题目链接:http://acm.tju.edu.cn/toj/showp2839.html(真的找不到链接了) 题目大意: 给你一个范围A~B,求出在整数A 到B之间,0到9这十个数字,分别出现了多少次? 1≤A,B≤10^18 样例输入  129 137 样例输出  1 10 2 9 1 1 1 1 0 1 题解: 数位DP 我的第一道数位DP。。尽管是基础水题但是搞了好久

1139: 数数(语言入门)

1139: 数数(语言入门) 1.描述 我们平时数数都是喜欢从左向右数的,但是我们的小白同学最近听说德国人数数和我们有些不同,他们正好和我们相反,是从右向左数的。因此当他看到123时会说“321”。 现在有一位德国来的教授在郑州大学进行关于ACM的讲座。现在他聘请你来担任他的助理,他给你一些资料让你找到这些资料在书中的页数。现在你已经找到了对应的页码,要用英文把页码告诉他。 为了简化我们的

牛牛数数 【线性基+二分】

链接:https://ac.nowcoder.com/acm/contest/10845/E 来源:牛客网 保证答案在long long内。 解法 这题可以说是线性基的模板题。先学习一下线性基: 线性基视频 处理完线性基之后,就可以使用其性质4: 求任意子集xor最大值: 把线性基中所有元素xor起来求任意子集xor最小值: 等于最小的主元查询x是否在值域中: 如果x能插入线性基,则x

试题 算法训练 YBH数数

试题 算法训练 YBH数数 问题描述   YBH数学很差,她数数时分不清4,5和8;我们定义YBH[i]为YBH的计数法对应的i的值。   规定:YBH[4] = 5,YBH[5] = 8;YBH[i]运算规则如下:   ① YBH[i+j] = YBH[i] + YBH[j]   ② YBH[ij] = YBH[i] * YBH[j]   我们会发现,用不同方法算出的YBH[i]的值是不同的,

jzoj 5770 可爱精灵宝贝

题目 题解 –是区间dp(好像dfs加神秘玄学剪枝也能过?) 首先,我们可以发现这个人走过的位置是一个区域,而且区域内部的精灵要么被抓,要么消失了(总之就是与以后的转移没有关系) 所以,状态定义: f[l][r][t] :当这个人走过区间[l,r],且目前在l处,时间为t时的最大分值 注意,l,r的左右位置要根据大小自己判断 然后我们又发现,现在这个人只有两种方法:左走或右走