[优先队列]HDOJ5289 Assignment
题意:有多少个区间,区间内最大的数减去最小的数差小于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的更多相关文章
- [HDOJ5289]Assignment(RMQ,二分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5289 题意:求满足区间内最大值和最小值差为k的区间个数. 预处理出区间的最值,枚举左端点,根据最值的单 ...
- HDU 5289 Assignment [优先队列 贪心]
HDU 5289 - Assignment http://acm.hdu.edu.cn/showproblem.php?pid=5289 Tom owns a company and he is th ...
- 2015暑假多校联合---Assignment(优先队列)
原题链接 Problem Description Tom owns a company and he is the boss. There are n staffs which are numbere ...
- 2015 Multi-University Training Contest 1 - 1002 Assignment
Assignment Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Mean: 给你一个数列和一个k,求连续区间的极值之 ...
- Stall Reservations(POJ 3190 贪心+优先队列)
Stall Reservations Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4434 Accepted: 158 ...
- POJ 3190 Stall Reservations (优先队列)C++
Stall Reservations Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7646 Accepted: 271 ...
- Stall Reservations(贪心+优先队列)
Description Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will onl ...
- Stall Reservations POJ - 3190 (贪心+优先队列)
Stall Reservations Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11002 Accepted: 38 ...
- POJ - 3190 Stall Reservations 贪心+自定义优先级的优先队列(求含不重叠子序列的多个序列最小值问题)
Stall Reservations Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one w ...
随机推荐
- Linux C 程序 Linux网络编程(21)
Linux网络编程网络编程必备的理论基础网络模型,地址,端口,TCP/IP协议 TCP/IP协议是目前世界上使用最广泛的网络通信协议日常中的大部分应用使用该系列协议(浏览网页,收发电子邮件,QQ聊天等 ...
- c# 分页控件
因为最近做的培训项目需要用到很多分页功能,自己写了一个分页方法,想找个时间重构,看到一篇博客,转载过来,分享学习. 原文链接:http://www.cnblogs.com/rr163/p/395593 ...
- C#操作系统日志
系统日志可以帮助我们分析操作系统的安全与否,也可以帮助我们将一些不好调试的信息显示出来. C#操作系统日志主要是通过EventLog类来实现的. 一 图解 打开事件查看器,其中与EventLog类对应 ...
- PHP中数组排序实例学习
先介绍下php中用于数组排序的函数: 排序方法 升序 降序 ...
- Delphi ISO 收藏!
CodeGear RAD Studio 2007 最终版(With Update4) v11.0.2902.10471http://altd.codegear.com/download/radstud ...
- mvvm结构中数据的关联----wpf
1.在视图中PlotView.xaml <Button Content="<<" Height="23" HorizontalAlignmen ...
- Environment variable ORACLE_UNQNAME not defined. Please set ORACLE_UNQNAME to database unique name. 的解决方法
环境:Oracle 11g r2 win7 问题描述:Environment variable ORACLE_UNQNAME not defined. Please set ORACLE_UNQN ...
- Excel REPT函数使用
需要制作1K大小的数据 使用Excel REPT函数可以迅速制造 Excel REPT 函数 =REPT(1,1024) 结果直接黏贴进txt文件,注意删除尾空格.
- jquery ztree插件
jquery json数据格式 操作tree数据 http://www.ztree.me/v3/main.php#_zTreeInfo
- 学习asp.net mvc5心得
前几天时间大体学习了一下asp.net mvc5的应用,感觉最主要的就是要区分这以模式设计,其他的都是在asp.net下的基础操作 1参数的传递注意 2路由的设置规则 3model的应用