先把题目抽象一下:

有一个静态的数组,求有多少个区间[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. 高精度乘法(FFT)

    学会了FFT之后感觉自己征服了世界! 当然是幻觉... 不过FFT还是很有用的,在优化大规模的动规问题的时候有极大效果. 一般比较凶残的计数动规题都需要FFT(n<=1e9). 下面是高精度乘法 ...

  2. 基于Appium、Python的自动化测试

    基于Appium.Python的自动化测试环境部署和实践   第一章 导言 1.1 编制目的 该文档为选用Appium作为移动设备原生(Native).混合(Hybrid).移动Web(Mobile ...

  3. querySelectorAll和getElementsBy 系列比较

    querySelectorAll 相比下面这些方法有什么区别? (1)getElementsByTagName (2)getElementsByClassName (3)getElementsByNa ...

  4. 网站流量统计之PV和UV

    转自:http://blog.csdn.NET/webdesman/article/details/4062069 如果您是一个站长,或是一个SEO,您一定对于网站统计系统不会陌生,对于SEO新手来说 ...

  5. 日志的打印 —— Java 支持

    1. java.util.logging.Logger 日志级别(logLevel) OFF,Integer.MAX_VALUE SEVERE,1000 WARNING,900 INFO,800 CO ...

  6. Windows下Tesseract4.0识别与中文手写字体训练

    一 . tesseract 4.0 安装及使用 1. tesseract 4.0 安装 安装包下载地址: http://digi.bib.uni-mannheim.de/tesseract/tesse ...

  7. Watir RAutomation VS AutoIt to deal with popup

    Watir使用过程中,经常遇到的弹出框分为几类: 1. Alert 2. Confirm 3. Prompt 4. File select Watir 处理弹出框,有很多方法,可以应用 AutoIt来 ...

  8. bzoj 3489 A simple rmq problem——主席树套线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题解:http://www.itdaan.com/blog/2017/11/24/9b ...

  9. centos7升级最新内核

    由于最近在测试ceph 的straw2算法,但是要使用straw2需要最新为4.1.0的内核,因此决定将虚机内核升级最新4.11.4. 步骤1.检查本机内核版本 #uname -sr 3.10.0-5 ...

  10. hdu-1181

    变形课 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submis ...