先把题目抽象一下:

有一个静态的数组,求有多少个区间[i,j]满足:j-i==max{ai,...,aj}-min{ai,...,aj}

也就是要求max-min+i-j==0的区间数

所以肿么做呢?

首先枚举i(这里倒着做,比较好理解),维护以i为开头的所有区间

相当于每次要在一坨区间的最前面同时加一个元素(并且增加一个仅含有ai的区间[i,i])

然后很惊喜的发现实际上对于这一坨区间的权值(max-min+i-j)只有以下几个操作:

1.同时-1,因为i减小了1

2.改max(这个一定只有有限段进行区间加减的操作)

3.改min(同理)

维护最大最小两个单调队列,每个元素(注意不是每次)出队的同时把它本来“管辖”的区域区间修改一下

这样就只需要一个兹磁区间修改兹磁查区间最小值及其出现次数的线段树即可

果断标记永久化(好写好想常数还小)

 #include <bits/stdc++.h>
#define mid (l+r>>1)
using namespace std;
long long dep,ret,n,p,debug;
int Min[],flag[],num[];
int posa[],posb[],a[],b[],s[];
void add(int now,int l,int r,int x,int y,long long z)
{
if(l==x && r==y)
{
Min[now]+=z;
flag[now]+=z;
return;
}
if(x<=mid) add(now<<,l,mid,x,min(y,mid),z);
if(y>mid) add(now<<|,mid+,r,max(x,mid+),y,z);
if(Min[now<<]==Min[now<<|])
Min[now]=Min[now<<]+flag[now],num[now]=num[now<<]+num[now<<|];
else
{
int t;
if(Min[now<<]<Min[now<<|]) t=now<<;
else t=now<<|;
Min[now]=Min[t]+flag[now];
num[now]=num[t];
}
}
void query(int now,int l,int r,int x,int y)
{
if(l==x && r==y)
{
if(Min[now]+dep==)
ret+=num[now];
return;
}
dep+=flag[now];
if(x<=mid) query(now<<,l,mid,x,min(y,mid));
if(y>mid) query(now<<|,mid+,r,max(x,mid+),y);
}
void build(int now,int l,int r)
{
if(l==r)
{
Min[now]=;
num[now]=;
return;
}
build(now<<,l,mid);
build(now<<|,mid+,r);
Min[now]=;
num[now]=r-l+;
}
int main()
{
scanf("%d",&n);
build(,,n);
for(int i=;i<=n;i++)
scanf("%d",&p),scanf("%d",&s[p]);
int la=,lb=;
posa[]=n+;posb[]=n+;
for(int i=n;i>=;i--)
{
while(la && a[la]<=s[i])
{
add(,,n,posa[la],posa[la-]-,s[i]-a[la]);
--la;
}
while(lb && b[lb]>=s[i])
{
add(,,n,posb[lb],posb[lb-]-,b[lb]-s[i]);
--lb;
}
++la;++lb;
a[la]=s[i];posa[la]=i;
b[lb]=s[i];posb[lb]=i;
dep=;
query(,,n,i,n);
add(,,n,i,n,-);
}
printf("%lld\n",ret);
return ;
}

Codeforces 526F Pudding Monsters的更多相关文章

  1. Codeforces 526F Pudding Monsters - CDQ分治 - 桶排序

    In this problem you will meet the simplified model of game Pudding Monsters. An important process in ...

  2. 奇袭 CodeForces 526F Pudding Monsters 题解

    考场上没有认真审题,没有看到该题目的特殊之处: 保证每一行和每一列都恰有一只军队,即每一个Xi和每一个Yi都是不一样 的. 于是无论如何也想不到复杂度小于$O(n^3)$的算法, 只好打一个二维前缀和 ...

  3. Codeforces 436D - Pudding Monsters(dp)

    Codeforces 题目传送门 & 洛谷题目传送门 u1s1 这题数据范围有点迷惑啊--乍一看 \(\mathcal O(nm)\) 过不去,还以为是正解是 \(\mathcal O(n+m ...

  4. Codeforces 436D Pudding Monsters

    题意简述 开始有无限长的一段格子,有n个格子种有布丁怪兽,一开始连续的布丁怪兽算一个布丁怪兽. 每回合你可以将一个布丁怪兽向左或右移动,他会在碰到第一个布丁怪兽时停下,并与其合并. 有m个特殊格子,询 ...

  5. 【CF526F】Pudding Monsters cdq分治

    [CF526F]Pudding Monsters 题意:给你一个排列$p_i$,问你有对少个区间的值域段是连续的. $n\le 3\times 10^5$ 题解:bzoj3745 Norma 的弱化版 ...

  6. [Codeforces526F]Pudding Monsters 分治

    F. Pudding Monsters time limit per test 2 seconds memory limit per test 256 megabytes In this proble ...

  7. CodeForces526F:Pudding Monsters (分治)

    In this problem you will meet the simplified model of game Pudding Monsters. An important process in ...

  8. CF526F Pudding Monsters

    CF526F Pudding Monsters 题目大意:给出一个\(n* n\)的棋盘,其中有\(n\)个格子包含棋子. 每行每列恰有一个棋子. 求\(k*k\)的恰好包含\(k\)枚棋子的子矩形个 ...

  9. 「CF526F」 Pudding Monsters

    CF526F Pudding Monsters 传送门 模型转换:对于一个 \(n\times n\) 的棋盘,若每行每列仅有一个棋子,令 \(a_x=y\),则 \(a\) 为一个排列. 转换成排列 ...

随机推荐

  1. CSS元素水平垂直居中方法总结(主要对大漠以及张鑫旭博客所述方法进行了归纳)

    本文主要是对主流居中方法进行了归纳,有些地方甚至就是把别人的代码直接复制过来的,没有什么自己的东西,除了大漠以及张鑫旭的方法外,还有来自司徒正美.怿飞博客的几个方法 以下方法,由于测试环境的原因,IE ...

  2. 20171202作业1python入门

    1.简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释型 编译型:需要编译器,执行前一次性翻译成机器能读懂的代码(如c,c++,执行速度快,调试麻烦) 解释型:需要解释器 ...

  3. html5--3.4 input元素(3)

    html5--3.4 input元素(3) 学习要点 input元素及其属性 input元素 用来设置表单中的内容项,比如输入内容的文本框,按钮等 不仅可以布置在表单中,也可以在表单之外的元素使用 i ...

  4. bootstrap学习大纲

    bootstrap 学习分三部分,分别是 css样式,css组件,js插件. 下面介绍三部分分别要学习的内容: 1.css样式:栅格系统,排版,代码,表格,表单,按钮,图片,辅助类,响应式工具. 2. ...

  5. 【UVA12779占位】Largest Circle

    几何题,希望有时间回来解决掉.

  6. MongoDB 复制集节点增加移除及节点属性配置

    复制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到辅助节点,并重放得以实现主从节点一致.再结合心跳机制,当感知到主节点不可访问或宕机 ...

  7. $bzoj4569$

    $st表+并查集$ $考虑暴力方法:我们每次将对应相等的位置用并查集连起来,那么最终答案就是9*10^{连通块个数-1}$ $很明显上面这个办法过不去,问题在于重复次数太多了,如果一个区间已经对应相等 ...

  8. PB调用C# Windows窗体

    以下是PB中的代码:String ls_filenameLong ll_wstyle=1long ll_hwnd,ll_nShowCmdstring ls_lpOperation,ls_lpFile, ...

  9. Android开发--环境搭建和调试技巧

    一:环境搭建 (1)我使用的环境是:window8+Java SDK+Eclipse+Android SDK+ADT 安装步骤:Java SDK-->Eclipse--->ADT---&g ...

  10. Matrix Recurrence

    给定矩阵$A,B$,且有 $$f(0) = A ,f(i) =B * \prod_{i=w(i)}^{i-1}f(i)$$ 求f(n) 其中,当w(i)单增时,可以做到$O(n*m^3)$,注意要优化 ...