题目链接

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的更多相关文章

  1. [2019杭电多校第十场][hdu6701]Make Rounddog Happy

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6701 题目大意为求满足 $max(a_{l},a_{l+1}\cdot \cdot \cdot a_{ ...

  2. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  3. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  4. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  5. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  6. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

  7. HDU 1796How many integers can you find(容斥原理)

    How many integers can you find Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d ...

  8. hdu 4481 Time travel(高斯求期望)(转)

    (转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...

  9. HDU 3791二叉搜索树解题(解题报告)

    1.题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3791 2.参考解题 http://blog.csdn.net/u013447865/articl ...

  10. hdu 4329

    problem:http://acm.hdu.edu.cn/showproblem.php?pid=4329 题意:模拟  a.     p(r)=   R'/i   rel(r)=(1||0)  R ...

随机推荐

  1. 林大妈的JavaScript基础知识(三):JavaScript编程(3)原型

    在一般的编程语言中,我们使用继承来复用代码,做成良好的数据结构.而在JavaScript中,我们使用原型来实现以上的需求.由于JavaScript专注于对象而摒弃了类,我们要明白原型和继承的确是有差异 ...

  2. 【Java例题】3.6 计算arcsin(x)的值

    6.使用泰勒展开式计算arcsin(x)的值. arcsin(x)=x+x^3/(2*3)+1*3*x^5/(2*4*5)+...+ (2n)!*x^(2n+1)/(2^2n)*(n!)^2*(2n+ ...

  3. weblogic10.3.6漏洞修改方案

    1.CVE-2018-2628漏洞 CVE-2018-2628漏洞利用的第一步是与weblogic服务器开放在服务端口上的T3服务建立socket连接,可通过控制T3协议的访问来临时阻断攻击行为. W ...

  4. 为什么建立数据仓库需要使用ETL工具?

    在做项目时是不是时常让客户有这样的困扰: 1.开发时间太长 2.花费太多 3.需要太多资源 4.集成多个事务系统数据总是需要大量人力成本 5.找不到合适的技能和经验的人 6.一旦建立,数据仓库无法足够 ...

  5. HTML加载FLASH(*.swf文件)详解

    引言 在web项目中经常会遇到在线浏览word文档,通常解决方法将word转换成pdf,然后在线浏览,但是在实际实现过程中,由于阅读器的原因,用户可以直接下载该pdf,这显然不是我们想要的,通过网络搜 ...

  6. java NIO知多少

    背景 Linux系统中的IO操作内部相当复杂,下面是一张带图片的LinuxIO相关层级关系: 下面是一个简化版本Linux内部IO层级图: 对此我的理解,java程序员版本的IO理解: java中的I ...

  7. Knative 基本功能深入剖析:Knative Serving 之服务路由管理

    导读:本文主要围绕 Knative Service 域名展开,介绍了 Knative Service 的路由管理.文章首先介绍了如何修改默认主域名,紧接着深入一层介绍了如何添加自定义域名以及如何根据 ...

  8. ReactJS:最大更新深度超出错误

    Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside com ...

  9. js-EventLoop

    1.浏览器事件环 eventLoop是由js的宿主环境(浏览器)来实现的 事件循环可以简单的描述为以下四个步骤 1.函数入栈,当Stack中执行到异步任务的时候,就将他丢给WebAPIs,接着执行同步 ...

  10. Mybatis中使用PageHelper插件进行分页

    分页的场景比较常见,下面主要介绍一下使用PageHelper插件进行分页操作: 一.概述: PageHelper支持对mybatis进行分页操作,项目在github地址: https://github ...