Codeforces 526F Pudding Monsters
先把题目抽象一下:
有一个静态的数组,求有多少个区间[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的更多相关文章
- Codeforces 526F Pudding Monsters - CDQ分治 - 桶排序
In this problem you will meet the simplified model of game Pudding Monsters. An important process in ...
- 奇袭 CodeForces 526F Pudding Monsters 题解
考场上没有认真审题,没有看到该题目的特殊之处: 保证每一行和每一列都恰有一只军队,即每一个Xi和每一个Yi都是不一样 的. 于是无论如何也想不到复杂度小于$O(n^3)$的算法, 只好打一个二维前缀和 ...
- Codeforces 436D - Pudding Monsters(dp)
Codeforces 题目传送门 & 洛谷题目传送门 u1s1 这题数据范围有点迷惑啊--乍一看 \(\mathcal O(nm)\) 过不去,还以为是正解是 \(\mathcal O(n+m ...
- Codeforces 436D Pudding Monsters
题意简述 开始有无限长的一段格子,有n个格子种有布丁怪兽,一开始连续的布丁怪兽算一个布丁怪兽. 每回合你可以将一个布丁怪兽向左或右移动,他会在碰到第一个布丁怪兽时停下,并与其合并. 有m个特殊格子,询 ...
- 【CF526F】Pudding Monsters cdq分治
[CF526F]Pudding Monsters 题意:给你一个排列$p_i$,问你有对少个区间的值域段是连续的. $n\le 3\times 10^5$ 题解:bzoj3745 Norma 的弱化版 ...
- [Codeforces526F]Pudding Monsters 分治
F. Pudding Monsters time limit per test 2 seconds memory limit per test 256 megabytes In this proble ...
- CodeForces526F:Pudding Monsters (分治)
In this problem you will meet the simplified model of game Pudding Monsters. An important process in ...
- CF526F Pudding Monsters
CF526F Pudding Monsters 题目大意:给出一个\(n* n\)的棋盘,其中有\(n\)个格子包含棋子. 每行每列恰有一个棋子. 求\(k*k\)的恰好包含\(k\)枚棋子的子矩形个 ...
- 「CF526F」 Pudding Monsters
CF526F Pudding Monsters 传送门 模型转换:对于一个 \(n\times n\) 的棋盘,若每行每列仅有一个棋子,令 \(a_x=y\),则 \(a\) 为一个排列. 转换成排列 ...
随机推荐
- 树莓派保持网络连接shell脚本
源:http://www.jianshu.com/p/96aa26d165c3 (我的简书文章) 故事背景 树莓派3b现在有了板载无线网卡,可以很方便的连接到wifi.但是无线路由器不能保证永远正常工 ...
- jmeter中的响应断言
断言就类似LoadRunner中的检查点.对上一个请求返回的信息,做字符串.数据包大小.HTML.XML.图片等做判断,确保返回的信息的准确性. jmeter的断言有好多,下面是一个响应断言 新建一个 ...
- TCP/IP 协议 —— ARP
通过 ARP 广播获得对方的 MAC 地址: 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议. 1. 特点 ARP ...
- MongoDB监控之一:运行状态、性能监控,分析
为什么要监控? 监控及时获得应用的运行状态信息,在问题出现时及时发现. 监控什么? CPU.内存.磁盘I/O.应用程序(MongoDB).进程监控(ps -aux).错误日志监控 1.4.1 Mong ...
- 【转】Cache Buffer Chain 第三篇
文章转自:http://oracle.chinaitlab.com/induction/862509.html,文章前部分转载,后部分自己加上的. Oracle数据库只读模式的CACHE BUFFER ...
- Bayesian 网络分类算法
1:贝叶斯网络的定义和性质 一个贝叶斯网络定义包括一个有向无环图(DAG)和一个条件概率表集合.DAG中每一个节点表示一个随机变量,可以是可直接观测变量或隐藏变量,而有向边表示随机变量间的条件依赖:条 ...
- TypeScript完全解读(26课时)_20.声明文件
首先学习识别已有的js库的类型 识别已有的js库的类型 UMD既可以作为全局库使用,也可以作为模块使用 先在着手来编写一个全局的库 新建文件 接收一个title,改变页面title的值 这里用到 &a ...
- awk用法总结
简介 awk的命名来自于他的三位创始人Alfred Aho .Peter Weinberger 和 Brian Kernighan 的姓氏的首字母. 有多种版本:New awk(nawk),GNU a ...
- lua面向对象实现(实例化对象、继承、多态、多继承、单例模式)
lua面向对象实现: 一个类就像是一个创建对象的模具.有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例.lua则没有类的概念,每个对象只能自定义行为和形态.不过,要在lua中模 ...
- php 发送邮件(实例)
html部分 <!DOCTYPE html> <html> <head> <title></title> <script type=& ...