51nod 1275 连续子段的差异
若[i,j]符合要求,那么[i,j]内的任何连续的子段都是符合要求的。我们可以枚举i,找到能合格的最远的j,然后ans+=(j-i+1)。
那么问题就转换成了:在固定i的情况下,如何判断j范围内是否合法?若[i,j]内的max-min<=K自然就合法。于是相当于求区间内的最值问题。这个可以用单调队列解决。
下面对代码给出一些解释:
1:为何是j-i而非j-i+1?因为当不合法时区间相当于[i,j),左闭右开,数量是i-j即可。
2:后面的两行如if (dqB.front() == i) dqB.pop_front(); 什么作用?因为要枚举i,所以到了下一个i的时候,若前面的i还在队列中,要去掉。
#include <bits/stdc++.h>
using namespace std; const int maxN=5e4+;
int N, M, K, T;
int g[maxN];
deque<int> dqB, dqS; int main() {
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
#endif
scanf("%d%d", &N, &K);
for (int i = ; i <= N; ++i)
scanf("%d", g + i);
int ans = ;
for (int i = , j = ; i <= N; ++i) {
while (j <= N) {
while (dqS.size() && g[dqS.back()] >= g[j]) dqS.pop_back();
dqS.push_back(j);
while (dqB.size() && g[dqB.back()] <= g[j]) dqB.pop_back();
dqB.push_back(j); if (g[dqB.front()] - g[dqS.front()] > K)
break;
++j;
}
ans += (j - i);
if (dqS.front() == i) dqS.pop_front();
if (dqB.front() == i) dqB.pop_front();
}
printf("%d", ans);
return ;
}
51nod 1275 连续子段的差异的更多相关文章
- 51nod 1275 连续子段的差异(twopointer+单调队列)
对于每一个i找到最近的j满足最大值-最小值>K,对答案的贡献为j-i,用单调队列维护最值即可 #include<iostream> #include<cstdlib> # ...
- 51nod 1275 连续字段的差异(单调队列)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1275 题意: 思路: 固定某个端点,然后去寻找满足能满足要求的最大区间, ...
- HDU 1003:Max Sum(DP,连续子段和)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- HDOJ-1003 Max Sum(最大连续子段 动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=1003 给出一个包含n个数字的序列{a1,a2,..,ai,..,an},-1000<=ai<=100 ...
- HPU 1007: 严格递增连续子段(贪心)
1007: 严格递增连续子段 [模拟] 时间限制: 1 Sec 内存限制: 128 MB提交: 244 解决: 18 统计 题目描述 给定一个有NN个正整数组成的序列,你最多可以改变其中一个元素,可以 ...
- HDU 1003 最大连续子段和
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1003 Max Sum Time Limit: 2000/1000 MS (Java/Others)M ...
- 【bzoj5089】最大连续子段和 分块+单调栈维护凸包
题目描述 给出一个长度为 n 的序列,要求支持如下两种操作: A l r x :将 [l,r] 区间内的所有数加上 x : Q l r : 询问 [l,r] 区间的最大连续子段和. 其中,一 ...
- [题解](线段树最大连续子段和)POJ_3667_Hotel
题意:1.求一个最靠左的长x的区间全部为0,并修改为1,输出这个区间的左端点 2.修改一个区间为0 实际上是维护最大连续子段和,原来也写过 大概需要维护一个左/右最大子段和,当前这段最大子段长,再维护 ...
- (DP)51NOD 1049 最大子段和
N个整数组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续子段和的最大值.当所给的整数均为负数时和为0. 例如:-2,11,-4,13,-5 ...
随机推荐
- [Linux]——进程管理相关
一些概念 程序program:通常以二进制程序放置在存储媒介中,以物理文件形式存在 进程process:程序通过用户执行被触发后,执行者的权限与属性.程序的代码和所需数据会被加载到内存中,OS给予这个 ...
- wcf读写cookie
一般来说,web应用的服务端(aspx或mvc的action)调用wcf时,是一个服务与服务的通讯,而不是客户端(浏览器)与服务器的通讯. 这种情况下,如果要在wcf端处理客户端的cookie,就需要 ...
- CentOS 7 防火墙端口配置
CentOS 7 防火墙端口配置查看防火墙是否开启systemctl status firewalld 若没有开启则开启systemctl start firewalld 查看所有开启的端口firew ...
- 云数据库Redis版256M双机热备款
云数据库Redis版是兼容Redis协议标准的.提供持久化的缓存式数据库服务,基于高可靠双机热备架构:全新推出的256M小规格款,适用于高QPS.小数据量业务,并支持免费全量迁移,完美服务于个人开发者 ...
- 0ctf2017-babyheap
前言 又是一道令人怀疑人生的 baby 题. 这道题利用思路非常巧妙,通过 堆溢出 和 fastbin 的机制构造了 information leak, 然后通过 fastbin attack 可以读 ...
- 重装系统,打开VS进行程序调试运行的时候 Unable to find manifest signing certificate in the certificate store
重装系统,打开VS进行程序调试运行的时候 Unable to find manifest signing certificate in the certificate store. 项目的属性-> ...
- canvas验证码 - 随机字母数字
基于canvas制作随机生成数字英文组合验证码效果,点击或刷新会自动重组.输入验证码提交验证效果代码. <div class="verification"> <i ...
- git bash 出现vim弹框的时候怎么退出
如果是输出状态,首先按Esc键退出输入状态,然后按Shift+“;”,再输入q!或wq!(不保存改动,wq!是保存文件的写入修改)退出. so easy!!
- java ee思维导图
该图是以网上的脑图作为参考,结合教材具体内容完成.
- select2加载远程数据示例
核心js $("#query_pack_code").select2({ language: "zh-CN", allowClear: true, width: ...