题意:有多少个区间,区间内最大的数减去最小的数差小于k

对每个数它所在的区间,可以只往前找(类似dp的无后效性) 比如对位置3的数,可以往前找的区间是[3, 3], [2, 3], [1, 3], [0, 3]这样

这样 遍历a[i] 对每个a[i]往前 就可以得到所有的区间

比如案例

10 5

0 3 4 5 2 1 6 7 8 9

(最小值,最大值)的形式

每个数增加一个(自己,自己)

一旦不满足条件了就不必再进行下去

那么很容易想到这是一个类似队列的情况

对于这个案例 跑一下队列就是

(把队中元素的个数加起来就是结果)

那么问题就转化成了怎么知道队列中存在一个数是要弹出的(也就是上述案例6的时候,怎么知道1在队列中)

我先用优先队列处理了一下每个数前面需要弹出的数的位置的最大值

再用队列模拟上述过程即可

 #include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define lson l, m
#define rson m+1, r
const int N=1e5+;
const LL mod=1e9+;
typedef pair<int, int> PI;
PI a[N];
int minn[N], maxn[N];
void out(priority_queue<PI, vector<PI>, greater<PI> > q)
{
while(!q.empty())
{
printf("(%d %d) ", q.top().first, q.top().second);
q.pop();
}
puts("");
} int main()
{
// freopen("1002.in", "r", stdin);
// freopen("out.txt", "w", stdout);
int t;
scanf("%d", &t);
while(t--)
{
int n, k;
scanf("%d%d", &n, &k);
for(int i=;i<n;i++)
{
int x;
scanf("%d", &x);
a[i]=make_pair(x, i);
}
memset(minn, -, sizeof(minn));
memset(maxn, -, sizeof(maxn));
priority_queue<PI, vector<PI>, greater<PI> > q1;
while(!q1.empty())
q1.pop();
q1.push(a[]);
for(int i=;i<n;i++)
{
while(q1.size()> && a[i].first-q1.top().first>=k)
{
minn[i]=max(q1.top().second, minn[i]);
q1.pop();
}
q1.push(a[i]);
// out(q1);
}
priority_queue<PI, vector<PI>, less<PI> > q2;
while(!q2.empty())
q2.pop();
q2.push(a[]);
for(int i=;i<n;i++)
{
while(q2.size()> && q2.top().first-a[i].first>=k)
{
maxn[i]=max(q2.top().second, maxn[i]);
q2.pop();
}
q2.push(a[i]);
}
// for(int i=0;i<n;i++)
// printf("%d %d\n", minn[i], maxn[i]); LL ans=;
queue<int> Q;
while(!Q.empty())
Q.pop();
int cur=;
for(int i=;i<n;i++)
{
if(minn[i]<cur)
minn[i]=-;
if(maxn[i]<cur)
maxn[i]=-;
while(!Q.empty() && (maxn[i]!=- || minn[i]!=-))
{
if(Q.front()==maxn[i])
maxn[i]=-;
if(Q.front()==minn[i])
minn[i]=-;
cur=Q.front();
Q.pop();
}
Q.push(a[i].second);
ans+=Q.size();
}
printf("%I64d\n", ans);
}
return ;
}

HDOJ 5289

[优先队列]HDOJ5289 Assignment的更多相关文章

  1. [HDOJ5289]Assignment(RMQ,二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5289 题意:求满足区间内最大值和最小值差为k的区间个数. 预处理出区间的最值,枚举左端点,根据最值的单 ...

  2. HDU 5289 Assignment [优先队列 贪心]

    HDU 5289 - Assignment http://acm.hdu.edu.cn/showproblem.php?pid=5289 Tom owns a company and he is th ...

  3. 2015暑假多校联合---Assignment(优先队列)

    原题链接 Problem Description Tom owns a company and he is the boss. There are n staffs which are numbere ...

  4. 2015 Multi-University Training Contest 1 - 1002 Assignment

    Assignment Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Mean: 给你一个数列和一个k,求连续区间的极值之 ...

  5. Stall Reservations(POJ 3190 贪心+优先队列)

    Stall Reservations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4434   Accepted: 158 ...

  6. POJ 3190 Stall Reservations (优先队列)C++

    Stall Reservations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7646   Accepted: 271 ...

  7. Stall Reservations(贪心+优先队列)

    Description Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will onl ...

  8. Stall Reservations POJ - 3190 (贪心+优先队列)

    Stall Reservations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11002   Accepted: 38 ...

  9. POJ - 3190 Stall Reservations 贪心+自定义优先级的优先队列(求含不重叠子序列的多个序列最小值问题)

    Stall Reservations Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one w ...

随机推荐

  1. 初识NoSQL 快速认识NoSQL数据库 分析Analytics For Hackers: How To Think About Event Data

    做了一年的大一年度项目了,对于关系型数据库结构还是有些了解了,有的时候还是觉得这种二维表不是很顺手.在看过一篇文章之后,对NoSQL有了初步的了解,(https://keen.io/blog/5395 ...

  2. java 语法糖

    package syntax.autoCase; import java.util.Arrays; import java.util.List; public class autoCase { pub ...

  3. mysql 的数据类型

    mysql 的数据类型(描述的是字段)三大类:一.整型:1.tinyint(M),其中M是显示宽度,需要配合zerofill,就是前面0填充,存储单位为1个字节(8位),无符文是最大能存储范围0000 ...

  4. Ant之build.xml

    转载地址:http://www.cnblogs.com/clarkchen/archive/2011/03/10/1980194.html http://lisongqiu168.iteye.com/ ...

  5. swap分区添加

    首先你需要使用命令:dd 来创建一个swapfile,然后你需要使用mkswap命令在设备或者文件中创建一个Linux swap分区a) 使用root用户登陆b) 使用下面的命令创建一个2G的 Swa ...

  6. Win7任务计划自由预设系统定时自动关机

    大家在使用电脑的时候可能会遇到一些需要无人值守让电脑自行执行任务后定时关机的情形,在Win7系统中,我们可以使用"任务计划"设置功能结合shutdown命令灵活设置任务计划,让Wi ...

  7. 关于Oracle表空间数据文件自增长的一些默认选项

    昨天,一个同事请教了一些关于Oracle表空间数据文件自增长的问题,解答过程中顺便整理起来,以后其他同事有同样的疑问时可以直接查阅. 实验内容: 创建MYTEST表空间,默认不开启自增长. 给MYTE ...

  8. libevent使用

    (sudo apt-get install libevent-dev) 1:安装libevent 用wget指令直接下载libevent:# wget http://www.monkey.org/~p ...

  9. WPF TextBox 的 EventTrigger & 重写控件

    遇到一个需求,在textbox获得焦点的时候,调用一个外部的软键盘. 这可以用两个不同的方法来达到目的. 1.EventTrigger 首先定义一个Style <Style x:Key=&quo ...

  10. 在wamp下PHP5.5安装php-redis扩展

    windows下开发用的xampp集成的环境,想装个php-redis扩展,扩展的github地址: https://github.com/nicolasff/phpredis 描述里找到window ...