原题:

小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[];
int que[];
int main(){
freopen("seq.in","r",stdin);
freopen("seq.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=n;i>=;i--)
{
while((t)&&(que[t]<a[i])){t--;}
que[++t]=a[i];
if(t->)
ans+=t-2ll;
}
printf("%lld\n",ans);
fclose(stdin);
fclose(stdout);
}

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

  1. 小Z爱划水(NOIP信(sang)心(bin)赛)From FallDream

    题目: 小Z在机房.他和其它机房同学都面临一个艰难的抉择,那就是 要不要划水? 每个人都有自己的一个意见,有的人想做题,有的人想划水. 当然,每个人只能选择一个事情做.如果一个人做的事情和他想做的不同 ...

  2. 小Z爱图论(NOIP信(sang)心(bin)赛)From FallDream

    题目: 小Z最近喜欢上了图论,于是他研究了一下图的连通性问题.但是他遇到了一个难题. 给定一个n个点的有向图,求有多少点对(i,j)满足从i点出发能到达点j ? 小Z仅会简单的朴素算法,所以他想问问你 ...

  3. 【20170920校内模拟赛】小Z爱学习

    所有题目开启-O2优化,开大栈空间,评测机效率为4亿左右. T1 小 Z 学数学(math) Description ​ 要说小 Z 最不擅长的学科,那一定就是数学了.这不,他最近正在学习加法运算.老 ...

  4. 【0521模拟赛】小Z爱数学

    题目描述 小Z想求F(n,k),F(n,k)表示n的所有因数pi中,满足n/pi <= k 的和. 小Z发现还是很水,所以他决定加大难度. 求 小Z还准备了很多个询问.现在你来解决一下吧. 输入 ...

  5. 【0521模拟赛】小Z爱划水

    题目描述 小Z和其它机房同学都面临一个艰难的抉择,那就是 要不要划水? 每个人都有自己的一个意见,有的人想做题,有的人想划水. 当然,每个人只能选择一个事情做.如果一个人做的事情和他想做的不同,那么他 ...

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

    [FZYZ P1280 ][NOIP福建夏令营]矩形覆盖 Description 有N个矩形,矩形的底边边长为1,且均在X轴上,高度给出,第i个矩形的高为h[i],求最少需要几个矩形才能覆盖这个图形. ...

  7. 2017-10-5模拟赛T2 小Z爱排序(sorting.*)

    Description Solution 比赛时找到了规律,但是没有证出来……(当然最后还是AC了……) 显然没有被操作的数在排好序的序列中一定是连续的一段. 所以,没有被操作的数一定从左到右连续地递 ...

  8. 【20170521校内模拟赛】热爱生活的小Z

    学长FallDream所出的模拟赛,个人感觉题目难度还是比较适中的,难度在提高+左右,可能比较接近弱省省选,总体来讲试题考查范围较广,个人认为还是很不错的. 所有试题如无特殊声明,开启-O2优化,时限 ...

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

    题意: 给一段序列,询问一个区间,求出区间中.....woc! 贴原题! 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过 ...

随机推荐

  1. 神经网络的训练和测试 python

    承接上一节,神经网络需要训练,那么训练集来自哪?测试的数据又来自哪? <python神经网络编程>一书给出了训练集,识别图片中的数字.测试集的链接如下: https://raw.githu ...

  2. scala高级性质-隐式转换 -02

    今天我们来介绍scala的高级特性,上次已经介绍过他的一个特性:高阶函数,这次是隐式转换 1.隐式转换的例子 read的例子 解析:发现这个file没有read的方法,然后就开始在开始在这个上下文里面 ...

  3. Atom使用插件精选(FE)

    [转]原文https://zhuanlan.zhihu.com/p/24753739?refer=AlenQi Atom琳琅满目的插件中,为前端coder推荐一些实用的插件. sync-setting ...

  4. ICG-智能代码生成器.(权限控制.融入平台).(表单引擎).(最低兼容IE8)

    请下拉滚动条... 代码生成器.附带客户端代码 个人平台:www.10086bank.com 界面: 1--首先是server制作界面(BS结构).直接上图:   2--点击提交生成一下文件: 各个代 ...

  5. 《数据结构与算法分析:C语言描述》复习——第四章“树”——二叉树

    2014.06.14 22:49 简介: 二叉树是学习树结构时接触的第一个概念,其他衍生的表示形式包括N叉树(随便多少叉).二叉链表(土话也叫左孩子右兄弟).由于单纯的二叉树是无序的,能做的事情不太多 ...

  6. 【ZigZag Conversion】cpp

    题目: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows l ...

  7. Pythonyield使用浅析

    转自:https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/ 您可能听说过,带有 yield 的函数在 Python ...

  8. Python 3基础教程13-写入文件

    前面介绍了函数,这篇我们就利用Python 内构函数open来写入字符串到txt文件里. 直接看demo.py 这里有一个小问题,如果我要输入时中文到txt文件会报unicode错误,暂时没法解决.

  9. Python编码、流程控制、格式化输出

    Python编码 初始编码: 电脑的传输,还有储存,实际上都是010101010 ASCII码: (American Standard Code for Information Interchange ...

  10. 一个初学者的辛酸路程-继续Django

    问题1:HTTP请求过来会先到Django的那个地方? 先到urls.py  ,里面写的是对应关系,1个URL对应1个函数名. 如果发URL请求过来,到达这里,然后帮你去执行指定的函数,函数要做哪些事 ...