原题:

小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. Fruits【水果】

    Fruits Many of us love July because it's the month when nature's berries and stone fruits are in abu ...

  2. POJ:3258-River Hopscotch

    River Hopscotch Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17740 Accepted: 7414 Desc ...

  3. Black Box POJ1442

    Description Our Black Box represents a primitive database. It can save an integer array and has a sp ...

  4. VIM 如何切换buffer

    命令 :ls 可查看当前已打开的buffer 命令 :b num 可切换buffer (num为buffer list中的编号) 其它命令: :bn -- buffer列表中下一个 buffer :b ...

  5. js简单的获取与输出

    js获取标签内容和输出内容到页面 获取: html: <select id="choiceSelect" onchange="changeImg()"&g ...

  6. 深度学习 GPU环境 Ubuntu 16.04 + Nvidia GTX 1080 + Python 3.6 + CUDA 9.0 + cuDNN 7.1 + TensorFlow 1.6 环境配置

    本节详细说明一下深度学习环境配置,Ubuntu 16.04 + Nvidia GTX 1080 + Python 3.6 + CUDA 9.0 + cuDNN 7.1 + TensorFlow 1.6 ...

  7. IAR FOR STM8S 错误 An error occurred while retrieving GDI features: gdi-error [40201]解决方法

    今早使用IAR调试编译调试一个工程,发现IAR竟然出现如下错误信息 An error occurred ]: Can't access configuration database 在网上查看了一下, ...

  8. 算法:枚举法---kotlin

    枚举法:效率低,循环所有的情况,找到正确答案 用于解决数学问题,还是很简单的. 比如,奥数里面: 算 法 描 述 题X题=题题题题题题 其中 算法描述题每一个为一个数字,请写出正确的数字. ok,我们 ...

  9. Managing WMI security

    TechNet Library TechNet Archive Windows Server 2003 Product Help Windows Server 2003 Product Help Ad ...

  10. Pascal 基础教程

    Pascal现在还有人想学习吗?先给出一本不错的Pascal教程,Object Pascal的教程我日后给出. Pascal基础教程       第一课 初识PASCAL语言           …… ...