题目描述

有 \(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. 数仓备份经验分享丨详解roach备份原理及问题处理套路

    本文分享自华为云社区<GaussDB(DWS) 备份问题定位思路>,作者: yd_216390446. 前言 在数据库系统中,故障分为事务内部故障.系统故障.介质(磁盘)故障.对于事务内部 ...

  2. 修改内置框架css 样式

    <style scoped> 1 <style scoped> 2 .info /deep/ .video{ // info 外层便签 /deep/ 可以理解为连接桥 .vid ...

  3. pythonapi接口怎么对接?

    ​ Python API接口对接是使用Python语言开发应用程序时,与外部API接口进行交互的一种方式.API(应用程序接口)是一种定义了程序或系统如何与另一个程序或系统进行交互的协议.通过使用Py ...

  4. Iphone常用工具

    iFunBox itools 百度助手 崩溃日志的路径 /var/mobile/Library/Logs/CrashReporter

  5. HTML一键打包APK工具 如何进行实名认证购买和激活

    HTML一键打包APK工具 价格表 授权时长 价格 1小时 49 1天 99 1个月 199 1个季度 399 半年 599 1年 799 付费版功能 功能点 免费版 付费版 去除广告信息 × √ 去 ...

  6. 如何实现一个数据库的 UDF?图数据库 NebulaGraph UDF 功能背后的设计与思考

    大家好,我是来自 BOSS直聘的赵俊南,主要负责安全方面的图存储相关工作.作为一个从 v1.x 用到 v3.x 版本的忠实用户,在见证 NebulaGraph 发展的同时,也和它一起成长. BOSS直 ...

  7. SpringBoot 后端配置 Https 教程

    以阿里云为例子 1. 申请 SSL 证书 1. 注册域名 打开阿里云官网,搜索域名 点击域名注册,输入域名,点击搜索 选择心仪的域名,点击购买,打钱 进入域名控制台,进行实名认证 2. 申请 SSL ...

  8. Solution -「YunoOI 2017」由乃的 OJ

    Description Link. 起床困难综合症 上树. Solution 线段树维护,树剖上树. 具体题解有空再写,我要去睡觉了. #include<bits/stdc++.h> ty ...

  9. 《流畅的Python》 读书笔记 230926(第一章后半部分)

    1.2 如何使用特殊方法 特殊方法的存在是为了被 Python 解释器调用的,你自己并不需要调用它们 就是说通常你都应该用len(obj)而不是obj.__len()__,无论是系统预置的,还是你自己 ...

  10. 14.8 Socket 一收一发通信

    通常情况下我们在编写套接字通信程序时都会实现一收一发的通信模式,当客户端发送数据到服务端后,我们希望服务端处理请求后同样返回给我们一个状态值,并以此判断我们的请求是否被执行成功了,另外增加收发同步有助 ...