题目描述

有 \(n\) 个二元组 \((a_i, b_i)\),编号为 1 到 n。

有一个初始为空的栈 SS,向其中加入元素 \((a_i, b_i)\) 时,先不断弹出栈顶元素直至栈空或栈顶元素 \((a_j , b_j)\) 满足 \(a_i \neq a_j\)且 \(b_i < b_j\) ,然后再将其加入栈中。

如果一个二元组入栈后栈内只有这一个元素,则称该二元组是“成功的”。

有 \(q\) 个询问 \([l_i, r_i]\),表示若将编号在 \([l_i, r_i]\) 中的二元组按编号从小到大依次入栈,会有多少个二元组是“成功的”。

询问之间相互独立。

输入格式

第一行两个正整数 \(n,q\)。

第二行 \(n\) 个正整数表示 \(a_i\)。

第三行 \(n\) 个正整数表示 \(b_i\)

接下来 \(q\) 行,每行两个正整数 \(l_i, r_i\),表示一组询问。

输出格式

\(q\) 行,每行一个自然数表示一组询问的答案。

输入输出样例

输入 #1

10 4
3 1 3 1 2 3 3 2 1 1
10 10 2 9 7 5 4 7 6 1
1 4
7 8
7 10
1 8

输出 #1

3
2
2
3

说明/提示

【样例解释】

以第一次询问 \([1, 4]\) 为例。

一开始栈为 \(\{\}\)。

加入 \(1\) 号二元组后栈为 \(\{(3,10)\}\),栈中只有一个元素,该二元组是“成功的”。

加入 \(2\) 号二元组 \((1, 10)\) 时,栈顶的 \((3, 10)\) 的 bb 值不大于 22 号二元组的,因此弹栈。此时栈空,\(2\) 号二元组入栈,栈为 \(\{(1, 10)\}\),该二元组是“成功的”。

加入 \(3\) 号二元组 \((3,2)\),此时栈顶元素与之 \(a\) 值不同,\(b\) 值比它更大,因而不需要弹栈,直接将 \(3\) 号二元组入栈,栈为 \(\{(1, 10),(3, 2)\}\),栈中有多个元素,该二元组不是“成功的”。

加入 \(4\) 号二元组 \((1,9)\),此时栈顶元素 \((3, 2)\) 的 \(b\) 值比它小,弹栈。弹栈后栈顶元素 \((1, 10)\) 与 \((1,9)\) 的 \(a\) 值相同,继续弹栈。此时栈空,\(4\) 号二元组入栈,栈为 \(\{(1, 9)\}\),该二元组是“成功的”。共有 \(3\) 个二元组是“成功的”,因而答案为 \(3\)。

【样例 2,3,4】

见附件 \(\texttt{stack/stack*.in}\) 与 \(\texttt{stack/stack*.ans}\)。

链接:https://pan.baidu.com/s/14XxLN63bxvpJAod81foGOg 提取码:gugu

【数据范围与提示】

对于所有测试点:\(1 \leq n, q \leq 5 \times 10^5\)

每个测试点的具体限制见下表:

测试点编号 特殊性质

\(1 \sim 3\) \(n,q \leq 1000\)

\(4 \sim 6\) \(n \leq 5000\)

\(7 \sim 10\) \(n,q \leq 10^5\)

\(11 \sim 12\) \(b_i=n-i+1\)

\(13 \sim 15\) \(a_i=i\)

\(16 \sim 20\) 无

先按照题意模拟求出一个数在栈中的上一位是谁,设上一个数是\(a_i\),这个可以模拟出来。那么设现在的询问求\(l\)到\(r\)的中有多少个"成功的"数,其实也就是再求\(a_l,a_{l+1}\cdots a_r\)中有多少个小于l。只要他的上一位是在l的前面,那么就代表他在弹栈的过程中整个栈他都可以退完,栈中只有他一个数,他就是"成功的"。

怎么求有多少个数小于l呢?这是主席树的模板。建立主席树,每一个位置i都建立新的版本,并插入\(a_i\)。那么我们可以知道在前r个数里面有多少个数小于\(l\),也可以在前面\(l-1\)个数里有多少个小于l,然后相减就是结果。当然,我们也可以缩小一下常数,前面\(l-1\)个数肯定怎么弹都是在\(l\)的前面,所以直接减去\(l-1\)即可。

#include<cstdio>
const int N=5e5+5;
int n,q,a[N],b[N],st[N],rt[N],idx,tp,l,r;
struct node{
int s,lc,rc;
}tr[N*40];
inline int read()
{
int x=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
void insert(int o,int p,int l,int r,int x)
{
if(l==r)
{
tr[o].s=tr[p].s+1;
return;
}
int md=l+r>>1;
if(md>=x)
{
tr[o].lc=++idx,tr[o].rc=tr[p].rc;
insert(tr[o].lc,tr[p].lc,l,md,x);
}
else
{
tr[o].rc=++idx,tr[o].lc=tr[p].lc;
insert(tr[o].rc,tr[p].rc,md+1,r,x);
}
tr[o].s=tr[tr[o].rc].s+tr[tr[o].lc].s;
}
int ask(int o,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
return tr[o].s;
int md=l+r>>1,ret=0;
if(md>=x)
ret+=ask(tr[o].lc,l,md,x,y);
if(md<y)
ret+=ask(tr[o].rc,md+1,r,x,y);
return ret;
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<=n;i++)
b[i]=read();
for(int i=1;i<=n;i++)
{
while(tp&&(a[st[tp]]==a[i]||b[st[tp]]<=b[i]))
--tp;
rt[i]=++idx;
insert(rt[i],rt[i-1],0,n,st[tp]);
st[++tp]=i;
}
while(q--)
{
l=read(),r=read();
printf("%d\n",ask(rt[r],0,n,0,l-1)-l+1);
}
return 0;
}

[NOI online22提高A] 丹钓战的更多相关文章

  1. NOI ONLINE 提高组 序列 根据性质建图

    题目链接 https://www.luogu.com.cn/problem/P6185 题意 应该不难懂,跳过 分析 说实话第一眼看到这题的时候我有点懵,真不知道怎么做,不过一看数据,还好还好,暴力能 ...

  2. NOI Online 提高组 题解

    来补坑了-- 个人认为三道题难度差不多-- 还有要说一嘴,为啥我在其他网站代码都好好的,复制到 cnblogs 上 Tab 就成 8 空格了?不过也懒得改了. T1 序列 首先,遇到这种加一减一还带附 ...

  3. [NOI Online 提高组]冒泡排序

    题目 洛谷等许多 \(OJ\) 都有 思路 考试题,今日无意又做了一次 然后发现自己读错题了······ 其实询问时只要 \(k\) 轮排序后的逆序对个数并不需要真的对序列进行更改 很显然 \(k\) ...

  4. springcloud微服务实战--笔记

    目前对Springcloud对了解仅限于:“用[注册服务.配置服务]来统一管理其他微服务” 这个水平.有待提高 Springcloud微服务实战这本书是翟永超2017年5月写的,时间已经过去了两年,略 ...

  5. 某dp题

    [NOI联考by ysy]庆典 2016年6月17日1,1040 [题目描述] 战狂在昌和帝国的首都法法城召开了庆典,向一万名最杰出的士兵分发了用魔法猪做的猪肉饺子,士兵们吃了猪肉饺子后,战斗力大幅提 ...

  6. 二分图&网络流初步

    链接 : 最小割&网络流应用 EK太低级了,不用. 那么请看:#6068. 「2017 山东一轮集训 Day4」棋盘,不用EK你试试? dinic模板及部分变形应用见zzz大佬的博客:网络流学 ...

  7. 矩阵乘法优化DP复习

    前言 最近做毒瘤做多了--联赛难度的东西也该复习复习了. Warning:本文较长,难度分界线在"中场休息"部分,如果只想看普及难度的可以从第五部分直接到注意事项qwq 文中用(比 ...

  8. [NOI导刊2010提高&洛谷P1774]最接近神的人 题解(树状数组求逆序对)

    [NOI导刊2010提高&洛谷P1774]最接近神的人 Description 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某 ...

  9. luogu P6570 [NOI Online #3 提高组]优秀子序列 二进制 dp

    LINK:P6570 [NOI Online #3 提高组]优秀子序列 Online 2的T3 容易很多 不过出于某种原因(时间不太够 浪了 导致我连暴力的正解都没写. 容易想到 f[i][j]表示前 ...

  10. [NOI Online 2021 提高组] 积木小赛

    思路不说了. 想起来自己打比赛的时候,没睡好.随便写了个\(HASH\),模数开小一半分都没有. 然后学了\(SAM\),发现这个判重不就是个水题. \(SAM\)是字串tire的集合体. 随便\(d ...

随机推荐

  1. 3.你不知道的go语言控制语句

    目录 本篇前瞻 Leetcode习题9 题目描述 题目分析 代码编写 知识点归纳 控制结构 顺序结构(Sequence) 声明和赋值 算术运算符 位运算符 逻辑运算 分支结构 if 语句 switch ...

  2. 微信小程序上传文件操作示范

    社会实践心得体会格式要求 提交的心得体会应为word文档,且图文并茂,全文段前.段后0,1.5倍行距. 题目:自拟,方正小标宋简体,小二号,加粗,居中. 个人信息:题目下方,宋体,小四号,加粗,居中, ...

  3. 强化学习 Proximal Policy Optimization (PPO)

    参考: 李宏毅老师课件 PPO = Policy Gradient 从 On-policy 到 Off-policy, 再加一些constraint Policy Gradient Basic Con ...

  4. js调起android安卓与ios苹果方法 vue3.0 + ts

    let shareSelect = (ev :any) => { const u :any= navigator.userAgent; const win :any = window const ...

  5. 如何平息WPS for linux启动后,笔记本风扇的怒吼

    create:2022-09-06 20:02:45 WPS启动后,点击菜单栏右上角[未同步]按钮,不登录,直接关掉.几秒后,笔记本风扇嗷嗷叫.桌面conky显示wpscloudsvr进程CPU占用8 ...

  6. ES13 中11个令人惊叹的 JavaScript 新特性

    前言 与许多其他编程语言一样,JavaScript 也在不断发展.每年,该语言都会通过新功能变得更加强大,使开发人员能够编写更具表现力和简洁的代码. 小编今天就为大家介绍ES13中添加的最新功能,并查 ...

  7. CVE-2018-8120 漏洞复现

    CVE-2018-8120 漏洞复现 漏洞描述 win32k.sys中函数 SetImeInfoEx未对指针进行合法性检查,从而导致一个任意地址写. 漏洞分析 漏洞成因 int __stdcall S ...

  8. DevOps平台建设的关键点是什么?

    关键还是在人 找到一个「吃过猪肉,见过猪跑的」,你问他什么是猪,他自然比「没吃过猪肉,没见过猪跑的人」更了解猪.海豚海豚,你知道猪是什么样么?它都没上过陆地,这辈子都没见过猪,它哪知道猪是什么样. 有 ...

  9. go defer简介

    思考 开始之前,先考虑下下面的代码的执行结果: package main import "fmt" func test() int { i := 0 defer func() { ...

  10. log4j2同步日志引发的性能问题

    1 问题回顾 1.1 问题描述 在项目的性能测试中,相关的接口的随着并发数增加,接口的响应时间变长,接口吞吐不再增长,应用的CPU使用率较高. 1.2 分析思路 谁导致的CPU较高,阻塞接口TPS的增 ...