【RQNOJ】460 诺诺的队列

【题目大意】

求所有数对(i,j)满足任意a[k]<=a[i]且a[k]<=a[j]。

形象地说,就是有一群人站成一列,每个人有一定的身高,然后问有多少对人可以互相看得到。

把数对(i,j)简单地称之为看得到的数对。

【解析】单调栈

先借用一下以前做的题:[Vijos]1926 紫色的手链,求任意区间最大值异或次大值的最大值。

回顾一下单调栈,就是存储从高到低递减的单调数据的栈。

借用以前的做法,求出来的东西相对于所有看得到的数对,对于所有a[i]相等的看得见的数对,只算了一次。

于是其实每次高过别人的时候操作只要加上s(a[i]),第一次比别人矮的时候加上1而不是s(a[i])。

把栈内的东西给扩充,不仅存元素,还存个数,这样就解决了。

单调栈代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

const int N=500001;

struct Stack
{
	int w,c;
}stk[N];
int size;
int n,w[N],cnt;

inline int read(void)
{
	int s=0,f=1; char c=getchar();
	for (;c<'0'||c>'9';c=getchar()) if (c=='-') f=-1;
	for (;'0'<=c&&c<='9';c=getchar()) s=(s<<1)+(s<<3)+c-'0';
	return s*f;
}

int main(void)
{
	n=read();
	for (int i=1;i<=n;i++) w[i]=read();

	for (int i=1;i<=n;i++)
	{
		for (;size&&stk[size].w<w[i];size--)
		{
			cnt+=stk[size].c;
			stk[size].w=stk[size].c=0;
		}
		if (size&&stk[size].w==w[i])
		{
			cnt+=stk[size].c;
			stk[size].c++;
			if (size-1) cnt++;
		}
		else
		{
			if (size) cnt++;
			stk[++size].w=w[i];
			stk[size].c=1;
		}
	}
	printf("%d\n",cnt);

	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-30 17:16:08

【RQNOJ】460 诺诺的队列的相关文章

LeetCode | 739.每日温度

根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高,请在该位置用 0 来代替. 例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]. 提示:气温 列表长度的范围是 [1, 30000].每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数. solution: 什么是单调栈? 单调栈分

【单调队列】【cogs825】【RQNOJ 167】免费午餐

825. [RQNOJ 167] 免费午餐 ★☆ 输入文件:lunch.in 输出文件:lunch.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 为了增加顾客,Sally的店铺决定提供免费午餐,顿时门庭若市,但是不久Sally的原材料不足了-.因此Sally决定公布一项决定:凡是来本店吃免费午餐的,一天吃能吃一次,吃的数量必须比上一次吃的少,且免费午餐将只有N个种类任君选择,为了能吃到最多的免费午餐,你将如何安排每日吃的数量呢? [输入文件] 第一行一个数N,表示免费

java redis使用之利用jedis实现redis消息队列

应用场景 对于数据库查询的IO连接数高.连接频繁的情况,可以考虑使用缓存实现. 从网上了解到redis可以对所有的内容进行二进制的存储,而java是可以对所有对象进行序列化的,序列化的方法会在下面的代码中提供实现. 序列化 这里我编写了一个java序列化的工具,主要是对对象转换成byte[],和根据byte[]数组反序列化成java对象: 主要是用到了ByteArrayOutputStream和ByteArrayInputStream: 需要注意的是每个自定义的需要序列化的对象都要实现Seria

操作系统课程设计 消息缓冲队列通信

消息缓冲队列通信机制其基本思想是根据“生产者——消费者”原理,利用内存中公用消息缓冲区实现进程间的信息交换. 在这种通信机制中,首先需要在内存中开辟若干空闲消息缓冲区,用以存放要通信的消息.每当一个进程需要向另一个进程发送消息时,便向系统申请一个空闲消息缓冲区,并把已准备好的消息复制到该缓冲区,然后把该消息缓冲区插入到接收进程的消息队列中,最后通知接收进程.接收进程接收到发送进程发来的通知后,从本进程的消息队列中摘下一消息缓冲区,取出其中的信息,然后把消息缓冲区作为空闲消息缓冲区归还给系统.系统

# 进程/线程/协程 # IO:同步/异步/阻塞/非阻塞 # greenlet gevent # 事件驱动与异步IO # Select\Poll\Epoll异步IO 以及selectors模块 # Python队列/RabbitMQ队列

1 # 进程/线程/协程 2 # IO:同步/异步/阻塞/非阻塞 3 # greenlet gevent 4 # 事件驱动与异步IO 5 # Select\Poll\Epoll异步IO 以及selectors模块 6 # Python队列/RabbitMQ队列 7 8 ############################################################################################## 9 1.什么是进程?进程和程序之间有什么

队列简单应用

一.问题描述: 1.题目内容:使用队列模拟理发馆的排队现象,通过仿真手法评估其营业状况. 设某理发馆设有N把理发椅,可同时为N位顾客进行理发.当顾客进门时,若有空闲理发椅,则立即入座理发,否则依次排队候理,一旦有顾客理完发离去时,排在队头的顾客便开始理发.假若理发馆每天连续营业T小时(只要有顾客等待,理发椅就不空),求一天内顾客在理发馆内的平均逗留时间(包括理发所需时间和排队等候的时间)与顾客排队等候理发的人数的平均值(排队长度的平均值). 2.基本要求 (1)当给定理发椅数及营业时间后,由随机

rqnoj 马棚问题

题目描述 每天,小明和他的马外出,然后他们一边跑一边玩耍.当他们结束的时候,必须带所有的马返回马棚,小明有K个马棚.他把他的马排成一排然后跟随它走向马棚,因为他们非常疲劳,小明不想让他的马做过多的移动.因此他想了一个办法:将马按照顺序放在马棚中,后面的马放的马棚的序号不会大于前面的马放的马棚的序号.而且,他不想他的K个马棚中任何一个空置,也不想任何一匹马在外面.已知共有黑.白两种马,而且它们相处得并不十分融洽.如果有i个白马和j个黑马在一个马棚中,那么这个马棚的不愉快系数将是i*j.所有k个马棚

多线程通用处理队列类(一)

最近实现了一个支持多FTP,同时FTP要多线程上传的小项目,通过对线程池的动态管理,很好的解决了同一时刻允许最大线程和空闲线程时任务自动入队的的问题,贴出来给大家使用: 1 /// <summary> 2 /// 表示一个线程(同步)安全的通用泛型处理队列 3 /// </summary> 4 /// <typeparam name="T">ProcessQueue中包含的数据类型</typeparam> 5 public class P

Redis分布式队列和缓存更新

原文链接:https://www.cnblogs.com/hua66/p/9600085.html 在使用Redis中,我们可能会遇到以下场景: 例如: 某用户向服务器中发送一个请求,服务器将用户请求加入Redis任务队列,任务完成则移出队列. 以上场景有几点疑问: Redis队列中数据如果不仅仅来自于我们的应用程序,那么我们怎么把这个数据加入Redis? 当Redis队列中用户的请求达程序所能处理的峰值.那么我们该如何处理这些用户请求? 解决方案: 对外提供接口,将请求数据添加至DB.启动一个