https://www.lydsy.com/JudgeOnline/problem.php?id=3956

从描述可以得到性质: 每个好点对 ( 除了差值为1的好点对 ) 中间的数 ( i , j ) 一定有一个最大值, 视这个值控制这个好点对, 那么每个值最多只控制一个好点对.

然后我们就可以通过单调栈 ( 求出lp[i]左边第一个大于i的数的坐标, rp[i]右边第一个大于i的数的坐标, lf[i]左边第一个大于等于i的数的坐标 (为避免重复只统计有重复区间的值里的最左边一个,即lp=lf则不统计) )  找到每个点控制的好点对 ( 也就是找到所有好点对 ) .

然后用主席树维护询问(对每个l建r作为查找值的树).

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=;
int n,m,T;
int a[maxn]={},sta[maxn]={},tail=;
int lp[maxn]={},rp[maxn]={},lf[maxn]={},rt[maxn]={};
int lc[maxn*]={},rc[maxn*]={},siz[maxn*]={},tot=;
struct nod{
int x,y;
}e[maxn];int cnt=;
bool mcmp(nod aa,nod bb){ return aa.x<bb.x; }
int read(){
int w=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){w=w*+ch-'';ch=getchar();}
return w*f;
}
void build(int &x,int y,int l,int r,int z){
x=++tot;siz[x]=siz[y]+;lc[x]=lc[y];rc[x]=rc[y];
if(l==r)return;
int mid=(l+r)/;
if(z<=mid)build(lc[x],lc[y],l,mid,z);
else build(rc[x],rc[y],mid+,r,z);
}
int getsum(int x,int y,int l,int r,int z,int t){
if(z<=l&&r<=t)return siz[y]-siz[x];
int mid=(l+r)/,ans=;
if(z<=mid)ans=getsum(lc[x],lc[y],l,mid,z,t);
if(t>mid)ans+=getsum(rc[x],rc[y],mid+,r,z,t);
return ans;
}
inline void fir(){
int i;
a[]=a[n+]=(<<);
for(i=;i<=n;++i){
while(a[sta[tail]]<=a[i])tail--;
lp[i]=sta[tail];sta[++tail]=i;
}
sta[]=n+;tail=;
for(i=n;i>;--i){
while(a[sta[tail]]<=a[i])tail--;
rp[i]=sta[tail];sta[++tail]=i;
}
tail=;sta[]=;
for(i=;i<=n;++i){
while(a[sta[tail]]<a[i])tail--;
lf[i]=sta[tail];sta[++tail]=i;
}
}
inline void init(){
int i,j;
for(i=;i<=n;++i){
if(lp[i]&&rp[i]<=n&&lp[i]==lf[i]){//最近的比a[i]大的数与a[i]间没有与a[i]相等的数,避免重复记录
e[++cnt].x=lp[i];e[cnt].y=rp[i];//lp[i]和rp[i]必须合法
}
}sort(e+,e+cnt+,mcmp);
for(i=j=;i<=n;++i){
rt[i]=rt[i-];
while(j<=cnt&&e[j].x==i){build(rt[i],rt[i],,n,e[j].y);j++;}
}
}
int main(){
int i,x,y,ans=;
n=read();m=read();T=read();
for(i=;i<=n;++i)a[i]=read();
fir(); init();
for(i=;i<=m;++i){
x=read();y=read();
if(T){x=(x+ans-)%n+;y=(y+ans-)%n+;}
if(x>y)swap(x,y);
ans=getsum(rt[x-],rt[y],,n,x,y)+y-x;
printf("%d\n",ans);
}
return ;
}

BZOJ 3956: Count 主席树 可持久化线段树 单调栈的更多相关文章

  1. 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex

    题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...

  2. [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+并查集+启发式合并)

    [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中 ...

  3. [BZOJ 4771]七彩树(可持久化线段树+树上差分)

    [BZOJ 4771]七彩树(可持久化线段树+树上差分) 题面 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节点的颜色为c[i].如果c[i] ...

  4. 主席树[可持久化线段树](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 ...

  5. 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 ...

  6. BZOJ.2653.[国家集训队]middle(可持久化线段树 二分)

    BZOJ 洛谷 求中位数除了\(sort\)还有什么方法?二分一个数\(x\),把\(<x\)的数全设成\(-1\),\(\geq x\)的数设成\(1\),判断序列和是否非负. 对于询问\(( ...

  7. 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665

    如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...

  8. BZOJ.4771.七彩树(可持久化线段树)

    BZOJ 考虑没有深度限制,对整棵子树询问怎么做. 对于同种颜色中DFS序相邻的两个点\(u,v\),在\(dfn[u],dfn[v]\)处分别\(+1\),\(dfn[LCA(u,v)]\)处\(- ...

  9. 权值线段树&&可持久化线段树&&主席树

    权值线段树 顾名思义,就是以权值为下标建立的线段树. 现在让我们来考虑考虑上面那句话的产生的三个小问题: 1. 如果说权值作为下标了,那这颗线段树里存什么呢? ----- 这颗线段树中, 记录每个值出 ...

  10. BZOJ 3653: 谈笑风生(DFS序+可持久化线段树)

    首先嘛,还是太弱了,想了好久QAQ 然后,这道题么,明显就是求sigma(size[x]) (x是y的儿子且层树小于k) 然后就可以发现:把前n个节点按深度建可持久化线段树,就能用前缀和维护了 其实不 ...

随机推荐

  1. 【译】第九篇 Integration Services:控制流任务错误

    本篇文章是Integration Services系列的第九篇,详细内容请参考原文. 简介在前面三篇文章,我们创建了一个新的SSIS包,学习了脚本任务和优先约束,并检查包的MaxConcurrentE ...

  2. 【疑点】<p></p>标签为什么不能包含块级标签?还有哪些特殊的HTML标签?

    最近,在码代码的时候,就是下面的这段代码,我犯了一个很不起眼,但犯了就致命的BUG. <body> <p> <ol> <li>Hello</li& ...

  3. CAS和AQS

    一.CAS CAS(Compare And Swap),即比较并交换.是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数——内存位置(V).预期原值(A)和新值(B).如果内 ...

  4. hibernate学习之一 框架配置

    hibernate 框架 1.hibernate框架应用在javaee三层结构中的dao层框架 2.好处就是不需要写复杂jdbc代码,不需要sql语句实现 3.是开源的轻量级框架 hibernate使 ...

  5. kickstart配置LINUX无人值守选项--rootpw

    linux kickstart rootpw密码可以使用明文,也可以使用加密过的值(密码为:IPPBXADMINROOT) 注意:在这里要使用加密过的值,否则安全性就太低了 rootpw --iscr ...

  6. Linux学习笔记:crontab定时任务

    通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本.时间间隔的单位可以是分钟.小时.日.月.周及以上的任意组合.这个命令非常适合周期性的日志分析或数据 ...

  7. python 常用的标准库及第三方库

    标准库Python拥有一个强大的标准库.Python语言的核心只包含数字.字符串.列表.字典.文件等常见类型和函数,而由Python标准库提供了系统管理.网络通信.文本处理.数据库接口.图形系统.XM ...

  8. Fedora下Eclipse/MyEclipse崩溃的解决方案

    Fedora19下使用myeclipse2013时,打开不到一分钟就异常关闭. 默认在home目录下生成一个log文件,里面显示的错误信息,说是libsoup.so文件导致出错.第一个想法是删除这个文 ...

  9. .NetCore读取配置Json文件到类中并在程序使用

    ConfigurationBuilder 这个类提供了配置绑定,在dnc中 Program中WebHost提供了默认的绑定(appsettings文件) 如果我们需要加载我们自己的json配置文件怎么 ...

  10. 团体队列(UVa540)

    题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_prob ...