小Z爱序列(NOIP信(sang)心(bin)赛)From Fall_Dream(粗制单调队列&单调栈的算法解析)

原题:

小Z最擅长解决序列问题啦,什么最长公共上升然后下降然后上升的子序列,小Z都是轻松解决的呢。

但是小Z不擅长出序列问题啊,所以它给了你一道签到题。

给定一个n个数的序列ai,你要求出满足下述条件的点对的数量。

假设点对是(i , j),max(l,r)是[l,r]当中最大的ai的值。

这个点对满足条件当且仅当i+1<j 且 ai < max(i+1,j-1) < aj

为了简单,保证输入的是一个1-n的排列。相信你已经会做了吧?

输入/输出格式

输入数据第一行有一个数字n,然后第二行有n个数。

输出仅包含一个数,表示满足条件的数对的数量。

样例输入/输出

Input:

5

1 2 3 4 5

Output:

6

样例解释

满足条件的分别是(1,3),(1,4),(1,5),(2,4),(2,5),(3,5)

数据范围与约定

      对于50%的数据,满足n<=300

对于95%的数据,满足n<=10000

对于100%的数据,满足n<=1000000

好吧,我承认。

这次考试所有的数据结构我都没学。(蒟蒻瑟瑟发抖。。)

首先看到题目n<=1000000

所以要O(N)算法

然而不论是线段树还是其他的算法维护max都是O(nlogn)(TLE 95分)

所以。。。

我们需要新的数据结构!

学长说这道题,水的很。。

单调栈来一个就搞过了。。(没学过。。。)

然后赶紧大补特补。。

单调栈就像一个简化版本的单调队列。

不过head是1,且队头指针永远不变

很显然,如果我们从n往1搜,a[i]对题目有贡献当且仅当a[i]右侧有2个比a[i]大的数

而它对答案的贡献就是右侧比它-2(点对条件看题目。。)

所以。。

就很简单啦。。(虽然我根本在考场上没写出来。。)

下面普及一下单调队列和单调栈的实现

首先我们先了解一下单调队列以及单调栈的操作

1、将一个元素插入队列。

2、将比这个元素大或等于这个元素的元素踢出队列

1的代码实现:que[++tail]=a[i];

2的代码实现:while(head<=tail&&que[tail]>=a[i])tail--;

当然有的题目还需要将队头向前移动:while(条件)head++;

然后我们将2个操作结合,就是单调队列啦、

在查询的时候我们只需要输出que[head]即可。(如果是单调栈,则输出que[1]);

由于每一个元素都进队一次,出队一次

复杂度均摊O(N)查询O(1);

所以很快QAQ

那为什么我们要用单调栈呢?

这个,,自己理解题意。。维护区间最小值、、

为什么要从N往1搜呢?(搞了好久才懂)

因为这道题求得是区间MAX,所以若从1往n搜,我们只能维护区间最小值,而队列中的元素会被后来的元素挤掉(无法统计答案),因为单调队列无法插入,只能用tail指针删除。所以要从N到1啦QAQ

Orz zxyer(1小时AK)

下面贴代码

#include<iostream>
#include<cstdio>
using namespace std;
int t,n;
unsigned long long ans;
int a[1000001];
int que[1000001];
int main(){
    freopen("seq.in","r",stdin);
    freopen("seq.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=n;i>=1;i--)
    {
        while((t)&&(que[t]<a[i])){t--;}
        que[++t]=a[i];
        if(t-2>0)
            ans+=t-2ll;
    }
    printf("%lld\n",ans);
    fclose(stdin);
    fclose(stdout);
} 
时间: 2024-10-13 06:13:33

小Z爱序列(NOIP信(sang)心(bin)赛)From Fall_Dream(粗制单调队列&单调栈的算法解析)的相关文章

【洛谷T4896】小Z爱划水

题目描述 小Z和其它机房同学都面临一个艰难的抉择,那就是 要不要划水? 每个人都有自己的一个意见,有的人想做题,有的人想划水. 当然,每个人只能选择一个事情做.如果一个人做的事情和他想做的不同,那么他会产生1不满意度. 更棘手的是,他们之间一些人是朋友,如果两人是朋友,但是他们做的事情不同,那么会有1不满意度产生. 小Z不想看到大家闹得不高兴,他想知道,不满意度最小能是多少? 输入输出格式 输入格式: 第一行两个数字n,m 分别表示有n个人和m对朋友关系 第二行n个0/1,1表示想做题,0表示想

小Z爱划水

题目背景 小Z在机房. 题目描述 小Z和其它机房同学都面临一个艰难的抉择,那就是 要不要划水? 每个人都有自己的一个意见,有的人想做题,有的人想划水. 当然,每个人只能选择一个事情做.如果一个人做的事情和他想做的不同,那么他会产生1不满意度. 更棘手的是,他们之间一些人是朋友,如果两人是朋友,但是他们做的事情不同,那么会有1不满意度产生. 小Z不想看到大家闹得不高兴,他想知道,不满意度最小能是多少? 输入输出格式 输入格式: 第一行两个数字n,m 分别表示有n个人和m对朋友关系 第二行n个0/1

【0521模拟赛】小Z爱数学

题目描述 小Z想求F(n,k),F(n,k)表示n的所有因数pi中,满足n/pi <= k 的和. 小Z发现还是很水,所以他决定加大难度. 求 小Z还准备了很多个询问.现在你来解决一下吧. 输入输出格式 输入格式: 第一行两个整数m 表示询问的个数 接下来每行两个数ni,ki,表示这个询问的n和k 输出格式: , 也就是把刚好等于k的答案加进去  然后k变大 对于每个询问输出一行一个整数,表示对应的答案. 题目理解:F(n,k)表示n的所有因数qi中,满足n/qi<=k的和, m组,每组给定n

【NOIP数据结构专项】单调队列单调栈

[洛谷P1901 ]发射站 http://www.luogu.org/problem/show?pid=1901 题目描述 某地有 N 个能量发射站排成一行,每个发射站 i 都有不相同的高度 Hi,并能向两边(当 然两端的只能向一边)同时发射能量值为 Vi 的能量,并且发出的能量只被两边最近的且比 它高的发射站接收. 显然,每个发射站发来的能量有可能被 0 或 1 或 2 个其他发射站所接受,特别是为了安 全,每个发射站接收到的能量总和是我们很关心的问题.由于数据很多,现只需要你帮忙计 算出接收

清橙A1206 小Z的袜子(莫队算法)

A1206. 小Z的袜子 时间限制:1.0s   内存限制:512.0MB 总提交次数:744   AC次数:210   平均分:44.44 将本题分享到: 查看未格式化的试题   提交   试题讨论 试题来源 2010中国国家集训队命题答辩 问题描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是

BZOJ 2038 小z的袜子 &amp; 莫队算法(不就是个暴力么..)

题意: 给一段序列,询问一个区间,求出区间中.....woc! 贴原题! 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务便是告诉小Z,他有多大的概率抽到两只颜色相同的袜子.当然,小Z希望这个概

【BZOJ2038】【莫队】小z的袜子

Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬.你的任务便是告诉小Z,他有多大的概率抽到两只颜色相同的袜子.当然,小Z希望这个概率尽量高,所以他可能会询问多个(L,R)以方便自己选择

bzoj 5028: 小Z的加油店——带修改的区间gcd

Description 小Z经营一家加油店.小Z加油的方式非常奇怪.他有一排瓶子,每个瓶子有一个容量vi.每次别人来加油,他会让 别人选连续一段的瓶子.他可以用这些瓶子装汽油,但他只有三种操作: 1.把一个瓶子完全加满: 2.把一个瓶子完全倒空: 3.把一个瓶子里的汽油倒进另一个瓶子,直到倒出瓶子空了或者倒进的瓶子满了. 当然,为了回馈用户,小Z会时不时选择连续一段瓶子,给每个瓶子容积都增加x. 为了尽可能给更多的人加油,每次客户来加油他都想知道他能够倒腾出的汽油量最少是多少? 当然他不会一点汽

Luogu 1494 - 小Z的袜子 - [莫队算法模板题]

题目链接:https://www.luogu.org/problemnew/show/P1494 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务便是告诉小Z,他有多大的概率抽到两只颜