【BZOJ-3956】Count ST表 + 单调栈
3956: Count
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 173 Solved: 99
[Submit][Status][Discuss]
Description
.png)
Input
.png)
Output
.png)
Sample Input
2 1 2
1 1
1 3
Sample Output
3
HINT
M,N<=3*10^5,Ai<=10^9
Source
CH Round#64 MFOI杯水题欢乐赛day1 By Gromah
Solution
思路有了之后,比较好写的一道题
首先我们计算以每个点为区间左端的答案,以及区间右端的答案,利用单调栈可以$O(N)$的处理出来
同样可以预处理出它们的前缀和
然后我们考虑一次询问,假如我们得到$[l,r]$中的最大值位置mp
那么我们的答案,相当于是询问区间$[l,mp]$中所有点作为左端的答案与$[mp+1,r]$中所有点作为右端点的答案
那么显然前缀和计算就好,至于查询最大位置?线段树/ST表都可以处理
这里采用ST表,总复杂度是$O(NlogN+M)$
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
inline int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define MAXN 300010
int N,M,T,h[MAXN]; long long last;
inline int GetL (int x,int y) {if (T) return min((x+last-)%N,(y+last-)%N)+; else return min(x,y);}
inline int GetR (int x,int y) {if (T) return max((x+last-)%N,(y+last-)%N)+; else return max(x,y);}
int log2[MAXN],dp[MAXN][];
inline int MaxPos(int x,int y) {return h[x]>h[y]? x:y;}
void ST()
{
log2[]=-;
for (int i=; i<=N; i++)
if (i&(i-)) log2[i]=log2[i-];
else log2[i]=log2[i-]+;
for (int i=; i<=N; i++) dp[i][]=i;
for (int j=; (<<j)<=N; j++)
for (int i=; i+(<<j)-<=N; i++)
dp[i][j]=MaxPos(dp[i][j-],dp[i+(<<(j-))][j-]);
}
inline int RMQ(int l,int r)
{
int tmp=log2[r-l+];
return MaxPos(dp[l][tmp],dp[r-(<<tmp)+][tmp]);
}
long long AnsL[MAXN],AnsR[MAXN];
int stack[MAXN],top;
void PreWork()
{
top=;
stack[++top]=h[];
for (int i=; i<=N; i++)
{
while (top && h[i]>stack[top]) AnsL[i]++,top--;
if (top) AnsL[i]++;
while (top && h[i]>=stack[top]) top--;
stack[++top]=h[i];
}
top=;
stack[++top]=h[N];
for (int i=N-; i>=; i--)
{
while (top && h[i]>stack[top]) AnsR[i]++,top--;
if (top) AnsR[i]++;
while (top && h[i]>=stack[top]) top--;
stack[++top]=h[i];
}
for (int i=; i<=N; i++) AnsL[i]+=AnsL[i-],AnsR[i]+=AnsR[i-];
ST();
}
inline void Solve(int L,int R)
{
int maxp=RMQ(L,R);
printf("%lld\n",last=AnsR[maxp-]-AnsR[L-]+AnsL[R]-AnsL[maxp]);
}
int main()
{
N=read(),M=read(),T=read();
for (int i=; i<=N; i++) h[i]=read();
PreWork();
while (M--)
{
int x=read(),y=read();
int L=GetL(x,y),R=GetR(x,y);
Solve(L,R);
}
return ;
}
【BZOJ-3956】Count ST表 + 单调栈的更多相关文章
- [多校联考2019(Round 4 T2)][51nod 1288]汽油补给(ST表+单调栈)
[51nod 1288]汽油补给(ST表+单调栈) 题面 有(N+1)个城市,0是起点N是终点,开车从0 -> 1 - > 2...... -> N,车每走1个单位距离消耗1个单位的 ...
- 【题解】 bzoj3956: Count (ST表+单调栈)
题面 Solution 看了一点点题解,自己又刚了\(2h30min\),刚了出来qwq,我好菜啊qwq 貌似这道题是BZOJ 4826的弱化,弱化都不会qwq凉凉 Solution 首先你可以考虑, ...
- BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]
4453: cys就是要拿英魂! Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 90 Solved: 46[Submit][Status][Discu ...
- BZOJ4540 [Hnoi2016]序列 【莫队 + ST表 + 单调栈】
题目 给定长度为n的序列:a1,a2,-,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,-,ar- 1,ar.若1≤l≤s≤t≤r≤n,则称a[s:t]是a[ ...
- 【BZOJ3611】[Heoi2014]大工程 欧拉序+ST表+单调栈
[BZOJ3611][Heoi2014]大工程 Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶 ...
- bzoj千题计划313:bzoj3879: SvT(后缀数组+st表+单调栈)
https://www.lydsy.com/JudgeOnline/problem.php?id=3879 把所有的后缀取出,按rank排序 求出相邻两个后缀的lcp 每个后缀对答案的贡献就是 与在它 ...
- bzoj千题计划314:bzoj3238: [Ahoi2013]差异(后缀数组+st表+单调栈)
https://www.lydsy.com/JudgeOnline/problem.php?id=3238 跟 bzoj3879 差不多 #include<cstdio> #include ...
- Codeforces Round #278 (Div. 1) B - Strip dp+st表+单调队列
B - Strip 思路:简单dp,用st表+单调队列维护一下. #include<bits/stdc++.h> #define LL long long #define fi first ...
- BZOJ 3956: Count 主席树 可持久化线段树 单调栈
https://www.lydsy.com/JudgeOnline/problem.php?id=3956 从描述可以得到性质: 每个好点对 ( 除了差值为1的好点对 ) 中间的数 ( i , j ) ...
随机推荐
- Centos6.2 下 vncserver 的安装
好久没用vnc了, 把今天装的过程记录一下, 这是一个从网上下载的标准Centos6.2 虚机镜像, 已经带了桌面. 默认的用户是root和tom, 口令都是tomtom. 因为ssh服务没起来, 简 ...
- CodeSmith 使用说明
〇. 前言 最近两天自己写了个简单的ORM框架,非常的Easy,但是没有相应的代码生成工具,于是就很杯具了! 于是乎,花费了一天的时间学习并写了一个CodeSmith可以使用的模 ...
- php数组函数,字符串,linux命令
1>> Linux常用命令一. 文件目录操作命令1. ls命令 命令格式:ls [选项] [目录名] 命令功能:列出目标目录中所有的子目录和文件.2. 命令格式:cd [目录名 ...
- MVC UpdateModel的未能更新XXXXX的类型模型
关于MVC UpdateModel的未能更新XXXXX的类型模型 的问题: 最近做MVC3的项目,相信很多人都碰到过这个问题,在此记录一下,异常:UpdateModel的未能更新XXXXX的类型模型 ...
- java:快速文件分割及合并
文件分割与合并是一个常见需求,比如:上传大文件时,可以先分割成小块,传到服务器后,再进行合并.很多高大上的分布式文件系统(比如:google的GFS.taobao的TFS)里,也是按block为单位, ...
- TinyFrame尾篇:整合Spring AOP实现用户认证
创建Manager用户验证表 这一篇主要讲解使用AOP对用户操作进行验证,如果通过验证,则继续执行,反之,则不能执行.其思想和上一篇完全一致. 由于需要用到用户认证,所以我们新建一个Manager实体 ...
- C/C++实践笔记 003
数据结构与算法程序=数据结构+算法语言是一种工具语言工具(c,c++)--程序设计方法(面向过程.面向对象)——数据结构(二叉树.队列.栈.红黑树.链表……)——算法(快速排序算法.冒泡排序算法.选择 ...
- 操作文件方法简单总结(File,Directory,StreamReader,StreamWrite )
对于文件夹,文档的操作一直处于一知半解状态,有时间闲下来了,好好练习了一把,对文档,文件的操作有了一个基本的认知, 若要深入了解,还是得通过实际的项目才行了,好了废话不多说,上酸菜!! 注:红色标题为 ...
- 171 Excel Sheet Column Number
/** * 题意:A表示1 B表示2 AA表示27 AB表示28 ------>给你一串字符串输出相应的数字 * 分析:这个就类似于二进制转十进制,从字符串后面往前遍历,然后pow(26,n)* ...
- ModernUI教程:目录 (完结)
入门 My first Modern UI app (manually) 第一个ModernUI应用(手动编写)(已完成) My first Moder ...