[优先队列]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 ...
随机推荐
- 《shell条件测试语句,字符串测试apache是否开启》
还得我想了10分钟才明白”!=“和"-n"的用法区别,做个笔记捋一捋 第一种方法:测试apache是否开启?字符串测试 #!/bin/bash web=`/usr/bin/pgre ...
- Centos(Linux) 根文件系统
/下面的文件 /boot:系统启动相关的文件:如内核,inittrd ,以及MBR grub /dev :设备文件: 块设备:随机访问,数据块 如:USB 字符设备:线性访问,按字符为单位如:鼠标,按 ...
- WCF 服务的ABC之地址(五)
地址 Address 在WCF中,每个服务都有一个唯一的地址(Address). 地址包含两个重要的元素:服务位置及传输协议. 服务位置包含目标机器名.站点.通信端口.管道(或队列),以及一个可选的特 ...
- ClickOnce证书签名
打开Microsoft .NET Framework 的SDK命令提示,按以下步骤操作: 1.创建一个自我签署的X.509证书(.cer)和一个.pvk私钥文件,用到makecert工具,命令如下: ...
- AngularJS(17)-Angular小程序
现在可以开始创建您的第一个 AngularJS 应用程序,一个 AngularJS 单页 Web 应用. <!DOCTYPE html> <html lang="en&qu ...
- oracle-linux下挂载"移动硬盘" NTFS类型
环境: ORACLE-LINUX 5.7 全新移动硬盘(未使用过) 移动硬盘空间3T 在默认情况下,Linux系统不支持NTFS分区挂载 1.服务器: A服务器和B服务器为一套ORACLE-RAC,移 ...
- openwrt无线中继教程
1.设置自己路由lan口的IP地址,网段不能跟上级路由的一样. 2.在无线标签下点击"扫描网络". 3.在新出现的界面中,会列出你附近的无线网络.点击你需要中继的网络右边的&quo ...
- redis 界面软件使用
ubuntu 下下载安装包 sudo dpkg -i redis-desktop-manager_0.8.3-120_amd64.deb//安装 redis-desktop-manager //启动
- thinkphp中curl的使用,常用于接口
/lib/action/PublicAction.class.php class PublicAction extends Action{ //curl,返回数组 public function ge ...
- matlab实现共轭梯度法、多元牛顿法、broyden方法
共轭梯度法: function [ x, r, k ] = CorGrant( x0, A, b ) x = x0; r = b - A * x0; d = r; X = ones(length(x) ...