【BZOJ3956】Count 主席树+单调栈
【BZOJ3956】Count
Description
Input
.png)
Output
Sample Input
2 1 2
1 1
1 3
Sample Output
3
HINT
M,N<=3*10^5,Ai<=10^9
题解:影魔那道题的简化版,依旧用单调栈记录每个数左(右)边第一个比它大的数为ld[i],rd[i],那么合法的点对只有(i,i+1)和(ld[i],rd[i])两种。为了防止重复,我们记录每个数左边第一个>=它的数le[i],当且仅当le[i]==ld[i]的时候我们才统计这样的点对。然后就变成了在一个二维平面内有一些点,每次问你一个矩形中点的个数,用主席树就行了。
但是自从观摩了单调栈+ST表的做法后感觉自己的做法烂成渣~
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=300010;
int n,m,typ,ans,tot,top,cnt;
struct sag
{
int ls,rs,sum;
}s[maxn*30];
int ld[maxn],rd[maxn],le[maxn],v[maxn],st[maxn],to[maxn],next[maxn],head[maxn],rt[maxn];
void add(int a,int b)
{
to[++cnt]=b,next[cnt]=head[a],head[a]=cnt;
}
int readin()
{
int ret=0; char gc=getchar();
while(gc<'0'||gc>'9') gc=getchar();
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret;
}
void insert(int x,int &y,int l,int r,int pos)
{
if(!y||y==x) y=++tot,s[y].sum=s[x].sum;
s[y].sum++;
if(l==r) return ;
int mid=l+r>>1;
if(pos<=mid) s[y].rs=(!s[y].rs)?s[x].rs:s[y].rs,insert(s[x].ls,s[y].ls,l,mid,pos);
else s[y].ls=(!s[y].ls)?s[x].ls:s[y].ls,insert(s[x].rs,s[y].rs,mid+1,r,pos);
}
int query(int x,int y,int l,int r,int a,int b)
{
if(a<=l&&r<=b) return s[y].sum-s[x].sum;
int mid=l+r>>1;
if(b<=mid) return query(s[x].ls,s[y].ls,l,mid,a,b);
if(a>mid) return query(s[x].rs,s[y].rs,mid+1,r,a,b);
return query(s[x].ls,s[y].ls,l,mid,a,b)+query(s[x].rs,s[y].rs,mid+1,r,a,b);
}
int main()
{
int i,j,a,b;
n=readin(),m=readin(),typ=readin();
for(i=1;i<=n;i++) v[i]=readin();
for(top=0,i=1;i<=n;i++)
{
while(top&&v[st[top]]<v[i]) rd[st[top--]]=i;
if(top) le[i]=st[top];
st[++top]=i;
}
while(top) rd[st[top--]]=n+1;
for(top=0,i=1;i<=n;i++)
{
while(top&&v[st[top]]<=v[i]) top--;
if(top) ld[i]=st[top];
st[++top]=i;
if(ld[i]&&ld[i]==le[i]) add(rd[i],ld[i]);
}
for(i=1;i<=n;i++)
{
if(i>1) insert(rt[i-1],rt[i],1,n,i-1);
for(j=head[i];j;j=next[j]) insert(rt[i-1],rt[i],1,n,to[j]);
}
for(i=1;i<=m;i++)
{
a=(readin()+ans-1)%n+1,b=(readin()+ans-1)%n+1;
if(a>b) swap(a,b);
printf("%d\n",ans=query(rt[a-1],rt[b],1,n,a,b)),ans*=typ;
}
return 0;
}
【BZOJ3956】Count 主席树+单调栈的更多相关文章
- bzoj 4826: [Hnoi2017]影魔 [主席树 单调栈]
4826: [Hnoi2017]影魔 题意:一个排列,点对\((i,j)\),\(p=max(i+1,j-1)\),若\(p<a_i,a_j\)贡献p1,若\(p\)在\(a_1,a_2\)之间 ...
- [AH2017/HNOI2017]影魔(主席树+单调栈)
设\(l[i]\)为i左边第一个比i大的数的下标.\(r[i]\)为i右边第一个比i大的数的下标. 我们把\(p1,p2\)分开考虑. 当产生贡献为\(p1\)时\(i\)和\(j\)一定满足,分别为 ...
- Codeforces 781E Andryusha and Nervous Barriers 线段树 单调栈
原文链接https://www.cnblogs.com/zhouzhendong/p/CF781E.html 题目传送门 - CF781E 题意 有一个矩形,宽为 w ,高为 h .一开始会有 w 个 ...
- 洛谷P4425 转盘 [HNOI/AHOI2018] 线段树+单调栈
正解:线段树+单调栈 解题报告: 传送门! 1551又是一道灵巧连题意都麻油看懂的题,,,,所以先解释一下题意好了,,,, 给定一个n元环 可以从0时刻开始从任一位置出发 每次可以选择向前走一步或者在 ...
- 线段树+单调栈+前缀和--2019icpc南昌网络赛I
线段树+单调栈+前缀和--2019icpc南昌网络赛I Alice has a magic array. She suggests that the value of a interval is eq ...
- 牛客多校第四场sequence C (线段树+单调栈)
牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...
- Codeforces 1175F - The Number of Subpermutations(线段树+单调栈+双针/分治+启发式优化)
Codeforces 题面传送门 & 洛谷题面传送门 由于这场的 G 是道毒瘤题,蒟蒻切不动就只好来把这场的 F 水掉了 看到这样的设问没人想到这道题吗?那我就来发篇线段树+单调栈的做法. 首 ...
- BZOJ 3956: Count 主席树 可持久化线段树 单调栈
https://www.lydsy.com/JudgeOnline/problem.php?id=3956 从描述可以得到性质: 每个好点对 ( 除了差值为1的好点对 ) 中间的数 ( i , j ) ...
- 【BZOJ-3956】Count ST表 + 单调栈
3956: Count Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 173 Solved: 99[Submit][Status][Discuss] ...
随机推荐
- HDU 5727.Necklace-二分图匹配匈牙利
好久没写过博客了,把以前的博客补一下. Necklace Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- j2ee性能调优之最小化资源压力测试法则
前面看到有人讲j2ee的性能调优,虽然这块不是自己的专长,但是猪养多了,也忍不住跳出来说几句. 虽然几乎每本讲性能调优的书籍开篇都会提,没必要的情况下就不要做调优,但是我个人还是认为,所有系统在上线前 ...
- spring配置文件中配置sessionFactory失败
配置失败主要原因有两个: <bean id="studentDaoImp" class="com.gxwuz.maven.dao.StudentDaoImp&quo ...
- 转:一个经典例子让你彻彻底底理解java回调机制
一个经典例子让你彻彻底底理解java回调机制 转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273 ...
- mac下virtualenv使用
1 sudo pip install virtualenv 安装 2 找一合适目录装虚拟环境 virtualenv virzhongguo 3 激活虚拟环境 source virzhongguo/ ...
- GPS整数。度分秒转换
例如30.453280 104.2018怎么把度数转换为度分秒的格式要详细换算方法 例如30.453280°,30.453280°,则有30°0.453280°×60= 27.1968′则有27′0. ...
- struts2获取前台提交的参数
CreateTime--2017年8月25日16:30:11 Author:Marydon struts2对获取前台提交参数的封装 需要导入: import java.util.Enumerati ...
- Allegro中解决鼠标放在走线上网络名、走线长度显示不出来的问题
一些PCB设计者在使用allegro时,由于一些误操作 导致当鼠标放在走线(cline)和网络(net)上面时,软件没有显示该走线的所属网络,或者相关的长度信息.本人经过help文档发现,以下方法可以 ...
- c# emit 动态实现接口
using System; using System.Linq; using System.Reflection; using System.Reflection.Emit; namespace Te ...
- Node.js下载及安装
Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快.易于扩展的网络应用. Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适 ...