hdu-6701 Make Rounddog Happy
题目链接
Problem Description
Rounddog always has an array a1,a2,⋯,an in his right pocket, satisfying 1≤ai≤n.
A subarray is a non-empty subsegment of the original array. Rounddog defines a good subarray as a subsegment al,al+1,⋯,ar that all elements in it are different and max(al,al+1,…,ar)−(r−l+1)≤k.
Rounddog is not happy today. As his best friend, you want to find all good subarrays of a to make him happy. In this case, please calculate the total number of good subarrays of a.
Input
The input contains several test cases, and the first line contains a single integer T (1≤T≤20), the number of test cases.
The first line of each test case contains two integers n (1≤n≤300000) and k (1≤k≤300000).
The second line contains n integers, the i-th of which is ai (1≤ai≤n).
It is guaranteed that the sum of n over all test cases never exceeds 1000000.
Output
One integer for each test case, representing the number of subarrays Rounddog likes.
Sample Input
2
5 3
2 3 2 2 5
10 4
1 5 4 3 6 2 10 8 4 5
Sample Output
7
31
题意
给出一个数组a和k,问有多少对\(l,r\)满足\(max(al,al+1,…,ar)−(r−l+1)≤k\)
题解
用启发式分治的方法遍历每个最大值掌控的区间,记区间为\([l,r]\),最大值在mid位置上,如果左区间更小就遍历左区间,计算以左区间每个点为左端点的方案数,否则就遍历右区间,预处理一个数组pre[i]表示以i向右最多延伸到哪里,使i到pre[i]数字不重复,suf[i]表示i向左最多延伸到哪里,使得suf[i]到i数字不重复,这样就能O(1)计算以每个点为左端点的方案数了。总体复杂度\(O(n\log n)\)
代码
#include <bits/stdc++.h>
using namespace std;
const int mx = 3e5+5;
int a[mx], pre[mx], suf[mx];
int n, k;
bool vis[mx];
struct Node {
int v, pos;
}tree[mx<<2];
void pushUp(int rt) {
tree[rt].v = max(tree[rt<<1].v, tree[rt<<1|1].v);
tree[rt].pos = (tree[rt<<1].v > tree[rt<<1|1].v ? tree[rt<<1].pos : tree[rt<<1|1].pos);
}
void build(int l, int r, int rt) {
if (l >= r) {
tree[rt].v = a[r];
tree[rt].pos = r;
return;
}
int mid = (l + r) / 2;
build(l, mid, rt<<1);
build(mid+1, r, rt<<1|1);
pushUp(rt);
}
int query(int L, int R, int l, int r, int rt) {
if (L <= l && r <= R) return tree[rt].pos;
int mid = (l + r) / 2;
int pos1 = -1, pos2 = -1;
if (L <= mid) pos1 = query(L, R, l, mid, rt<<1);
if (mid < R) pos2 = query(L, R, mid+1, r, rt<<1|1);
if (pos1 == -1) return pos2;
else if (pos2 == -1) return pos1;
else return a[pos1] > a[pos2] ? pos1 : pos2;
}
void dfs(int l, int r, long long &ans) {
if (l > r) return;
int mid = query(l, r, 1, n, 1);
int len = max(1, a[mid]-k);
if (mid-l <= r-mid) {
for (int i = l; i <= mid; i++) {
int L = max(mid, i+len-1);
int R = min(pre[i], r);
ans += max(0, R-L+1);
}
} else {
for (int i = mid; i <= r; i++) {
int R = min(mid, i-len+1);
int L = max(suf[i], l);
ans += max(0, R-L+1);
}
}
dfs(l, mid-1, ans);
dfs(mid+1, r, ans);
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
build(1, n, 1);
int pos = 0;
for (int i = 1; i <= n; i++) {
while (pos < n && !vis[a[pos+1]]) {
pos++;
vis[a[pos]] = true;
}
pre[i] = pos;
vis[a[i]] = false;
}
pos = n+1;
for (int i = n; i >= 1; i--) {
while (pos > 1 && !vis[a[pos-1]]) {
pos--;
vis[a[pos]] = true;
}
suf[i] = pos;
vis[a[i]] = false;
}
long long ans = 0;
dfs(1, n, ans);
printf("%lld\n", ans);
}
return 0;
}
hdu-6701 Make Rounddog Happy的更多相关文章
- [2019杭电多校第十场][hdu6701]Make Rounddog Happy
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6701 题目大意为求满足 $max(a_{l},a_{l+1}\cdot \cdot \cdot a_{ ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
- HDU 1796How many integers can you find(容斥原理)
How many integers can you find Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d ...
- hdu 4481 Time travel(高斯求期望)(转)
(转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...
- HDU 3791二叉搜索树解题(解题报告)
1.题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3791 2.参考解题 http://blog.csdn.net/u013447865/articl ...
- hdu 4329
problem:http://acm.hdu.edu.cn/showproblem.php?pid=4329 题意:模拟 a. p(r)= R'/i rel(r)=(1||0) R ...
随机推荐
- SparkStreaming对接rabbitMQ
/** * SparkStreaming对接rabbitmq java代码 */public class SparkConsumerRabbit { public static void main(S ...
- Hive映射HBase表的几种方式
1.Hive内部表,语句如下 CREATE TABLE ods.s01_buyer_calllogs_info_ts( key string comment "hbase rowkey&qu ...
- python利用select实现的Socket Server
# 利用python的select模块实现简单的Socket Sever #实现多用户访问,再次基础上可以实现FTP Server应用程序 # 发布目的,在于解决了客户端强行终止时,服务器端也跟着程序 ...
- oracle实战(一)
一.表空间的创建以及删除 声明:此操作环境为windows,oracle10G 表空间? ORACLE数据库的逻辑单元. 数据库---表空间 一个表空间可以与多个数据文件(物理结构)关联 一个数据库下 ...
- 从windows10迁移到Linux Deepin
如题, 这几天从windows系统迁移到deepin的linux系统花了很多时间, 以致最近都没时间来博客园.现在将这几天的成果分享出来, 顺便也做个记录.先不多说, 上一张新系统界面. 其实在装de ...
- Spring 源码学习(一)-容器的基础结构
关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料 展示的代码摘取了一些核心方法,去掉一些默认设置和日志输出,还有大多数错误异常也去掉了,小伙伴想看详细代码 ...
- WEB基础(一)--JSP的9个内置对象
1.request request 对象是 javax.servlet.httpServletRequest类型的对象. 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据. ...
- Netty学习(三)-Netty重要接口讲解
上一节我们写了一个HelloWorld,对于Netty的运行有了一定的了解,知道Netty是如何启动客户端和服务器端.这一节我们简要的讲解一下几个重要的接口,初步探讨Netty的运行机制,当然刚学Ne ...
- FutrueTask原理及源码分析
1.前言 相信很多人了解到FutureTask是因为ThreadPoolExecutor.submit方法,根据ThreadPoolExecutor.submit的使用,我们可以先猜一下FutureT ...
- 对平底锅和垃圾的O奖论文的整理和学习[2](2018-02-08发布于知乎)
其实这篇论文看了一段时间,愣是没看出来这个模型怎么建立的.虽然看不懂,但是有一些部分还是很喜欢. 首先是摘要: 摘要分为八段 第一段:背景引入,太空垃圾的问题日益严重. 第二段:本文工作,包括基本的i ...