【bzoj3956】Count 单调栈+可持久化线段树
题目描述
.png)
输入
.png)
输出
.png)
样例输入
3 2 0
2 1 2
1 1
1 3
样例输出
0
3
题解
单调栈+可持久化线段树
本题是 bzoj4826 的弱化版(我为什么做题总喜欢先挑难的做QAQ)
$k$对点对$(i,j)$有贡献,当且仅当$a_k=max(a_{i+1},a_{i+2},...,a_{r-1})$,且$a_k<a_i\&\&a_k<a_j$。
那么我们可以使用单调栈求出i左面第一个比它大的位置$lp[i]$,和右面第一个比它大的位置$rp[i]$,那么点对$(lp[i],rp[i])$就是满足第二个条件的点对。
但是这样还不行,因为在本题中可能会出现相同的数,它们的贡献可能是一样的,但是一个点对却只能被计算一次。
所以我们固定在贡献相同的点中让最左边的点产生贡献,其余不产生贡献。所以再使用单调栈求出i左面第一个大于等于它的位置$lf[i]$,那么只把$lp[i]=lf[i]$的点的贡献考虑进答案中。
然后问题就转化为:给定平面上一些点(不超过n个),求以$(a,a)$和$(b,b)$为顶点的矩形中有多少个节点(包括边界)
对于每个横坐标建立一棵可持久化线段树,对于一个点在它横坐标版本的可持久化线段树中插入它纵坐标位置的数。
最后查询时就是查对于区间[a,b],root[b]与root[a-1]的差。
最后再把第一种情况的答案(当然是要单独拿出来处理啊!)加上并输出即可。
#include <cstdio>
#include <algorithm>
#define N 300010
using namespace std;
struct data
{
int x , y;
bool operator<(const data a)const {return x < a.x;}
}a[N];
int v[N] , lp[N] , rp[N] , lf[N] , sta[N] , top , cnt , root[N] , ls[N * 20] , rs[N * 20] , si[N * 20] , tot;
void insert(int p , int l , int r , int x , int &y)
{
y = ++tot , si[y] = si[x] + 1;
if(l == r) return;
int mid = (l + r) >> 1;
if(p <= mid) rs[y] = rs[x] , insert(p , l , mid , ls[x] , ls[y]);
else ls[y] = ls[x] , insert(p , mid + 1 , r , rs[x] , rs[y]);
}
int query(int b , int e , int l , int r , int x , int y)
{
if(b <= l && r <= e) return si[y] - si[x];
int mid = (l + r) >> 1 , ans = 0;
if(b <= mid) ans += query(b , e , l , mid , ls[x] , ls[y]);
if(e > mid) ans += query(b , e , mid + 1 , r , rs[x] , rs[y]);
return ans;
}
int main()
{
int n , m , type , i , j , x , y , last = 0;
scanf("%d%d%d" , &n , &m , &type);
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &v[i]);
v[0] = v[n + 1] = 1 << 30;
for(i = 1 ; i <= n ; i ++ )
{
while(v[sta[top]] <= v[i]) top -- ;
lp[i] = sta[top] , sta[++top] = i;
}
top = 0 , sta[0] = n + 1;
for(i = n ; i >= 1 ; i -- )
{
while(v[sta[top]] <= v[i]) top -- ;
rp[i] = sta[top] , sta[++top] = i;
}
top = 0 , sta[0] = 0;
for(i = 1 ; i <= n ; i ++ )
{
while(v[sta[top]] < v[i]) top -- ;
lf[i] = sta[top] , sta[++top] = i;
}
for(i = 1 ; i <= n ; i ++ )
if(lp[i] && rp[i] <= n && lp[i] == lf[i])
a[++cnt].x = lp[i] , a[cnt].y = rp[i];
sort(a + 1 , a + cnt + 1);
for(i = j = 1 ; i <= n ; i ++ )
{
root[i] = root[i - 1];
while(j <= cnt && a[j].x == i) insert(a[j].y , 1 , n , root[i] , root[i]) , j ++ ;
}
while(m -- )
{
scanf("%d%d" , &x , &y);
if(type == 1) x = (x + last - 1) % n + 1 , y = (y + last - 1) % n + 1;
if(x > y) swap(x , y);
printf("%d\n" , last = query(x , y , 1 , n , root[x - 1] , root[y]) + y - x);
}
return 0;
}
【bzoj3956】Count 单调栈+可持久化线段树的更多相关文章
- 【bzoj4826】[Hnoi2017]影魔 单调栈+可持久化线段树
题目描述 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个灵魂,都有着自己 ...
- BZOJ 4826: [Hnoi2017]影魔 单调栈+可持久化线段树
Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他收集了各式各样 的灵魂,包括诗人.牧师.帝王.乞丐.奴隶.罪人,当然,还有英雄.每一个 ...
- BZOJ 2588: Spoj 10628. Count on a tree-可持久化线段树+LCA(点权)(树上的操作) 无语(为什么我的LCA的板子不对)
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 9280 Solved: 2421 ...
- bzoj3956: Count (单调栈+st表)
题面链接 bzoj 题解 非常巧妙的一道题 类似[hnoi影魔] 每个点会给左右第一个大于它的点对产生贡献 可以用单调栈求出 这里有点小细节,就是处理相等的点时,最左边的点管左边的贡献,最右边的点管最 ...
- 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )
在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...
- BZOJ - 2588 Spoj 10628. Count on a tree (可持久化线段树+LCA/树链剖分)
题目链接 第一种方法,dfs序上建可持久化线段树,然后询问的时候把两点之间的所有树链扒出来做差. #include<bits/stdc++.h> using namespace std; ...
- [BZOJ4826][HNOI2017]影魔 可持久化线段树
链接 题意:给你 \(1\) 到 \(n\) 的排列 \(k_1,k_2,\dots,k_n\) ,对 \(i,j (i<j)\)来说,若不存在 \(k_s (i<s<j)\) 大于 ...
- 洛谷P3994 Highway(树形DP+斜率优化+可持久化线段树/二分)
有点类似NOI2014购票 首先有方程$f(i)=min\{f(j)+(dep_i-dep_j)*p_i+q_i\}$ 这个显然是可以斜率优化的... $\frac {f(j)-f(k)}{dep_j ...
- 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)
Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...
随机推荐
- RK3288开发过程中遇到的问题点和解决方法之Devices
分区大小和“多用户支持” \device\rockchip\common\BoardConfig.mk BUILD_WITH_UMS ?= true改为BUILD_WITH_UMS ?= false ...
- mongodb主从配置信息查看与确认
在local库中不仅有主从日志 oplog集合,还有一个集合用于记录主从配置信息 system.replset: > use local > show collections > d ...
- HDU 3586 Information Disturbing (树形DP,二分)
题意: 给定一个敌人的通信系统,是一棵树形,每个节点是一个敌人士兵,根节点是commander,叶子是前线,我们的目的是使得敌人的前线无法将消息传到commander,需要切断一些边,切断每条边需要一 ...
- 洛谷 P2419 [USACO08JAN]牛大赛Cow Contest
题目背景 [Usaco2008 Jan] 题目描述 N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a p ...
- ulrlib案例-爬取百度贴吧
1.任务需求 百度贴吧有很多主题,每个主题下的网页存在很多分页.爬取不同的主题,并下载每个主题下的多页网页. 输入贴吧名称,下载相应贴吧的多页网页,设置最多下载50页. 2.分析网页 访问不同的百度贴 ...
- Java中的线程--线程中的工具
这主要想写一下Java中的jdk提供的一些线程中的工具, 一.semaphore信号灯 Semaphore可以维护当前访问自身的线程个数,并提供了同步机制,使用Semaphore可以控制同时访问资源的 ...
- Bootstrap 网格系统(Grid System)实例2
Bootstrap 网格系统(Grid System):堆叠水平,两种样式 <!DOCTYPE html><html><head><meta http-equ ...
- Flask——蓝图
蓝图介绍 一个项目中,有不同的模块,但是只有一个入口,程序入口可以随便取名,一般叫做,app.py或者manage.py.当我们写一个程序,当然可以在一个文件中写完,但是有一定规模的项目,我们肯定不会 ...
- URAL1765 Error 404
题目描述: vjudge 题解: STO ljx OTZ 下面这个算法是这位贡献的. 不妨将删去改为加入. 那么对于$n=p^k$,即只有一个质因子的$n$来说,若$i$已选,那么$i+n/p$.$i ...
- (42)zabbix使用IT services 了解服务器SLA整体情况
什么是IT Services 服务器或者某项服务.业务的可用率,不懂技术的上级领导会过问最近服务器可用率如何.所有api的状况怎么样? 通常一些技术人员会说负载怎么样,哪些cpu使用率怎么样,硬盘使用 ...