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\) 为一个排列. 转换成排列 ...
随机推荐
- CentOS(Linux) - 安装软件笔记(总) - 开发环境安装顺序及汇总
1.安装java环境 参考文章 CentOS7.1 使用资源搜集 2.需要可视化管理服务器时,需要先安装VPSmate 参考文章 CentOS(Linux) - 安装软件笔记(一) - VPSMate ...
- haproxy小结(一)基础概念篇
HAProxy是法国人Willy Tarreau个人开发的一个开源软件,目标是应对客户端10000以上的同时连接,为后端应用服务器.数据库服务器提供高性能的负载均衡服务.HAproxy可以实现基于TC ...
- 蓝桥杯 2014本科C++ B组 地宫取宝 DFS+记忆化搜索
历届试题 地宫取宝 时间限制:1.0s 内存限制:256.0MB 问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角 ...
- eclipse编辑窗口不见了(打开左边的java、xml文件,中间不会显示代码)
转自:https://blog.csdn.net/u012062810/article/details/46729779?utm_source=blogxgwz4 1. windows-->re ...
- Java--23种设计模式之decorator模式
装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性.动态给一个对象增加功能,这些功能可以再动态的撤消.增加由一些基本功能的排列组合而产生的非常大量的 ...
- elmo驱动器使用EAS II配置教程
一.驱动器接线 1.1驱动器接口: 驱动器接线,需要连接两个接口,一个是反馈接口,一个是STO接口. 反馈接口,我这里使用了elmo驱动器的Port A.这个接口提供5v电源.并且可以输入旋转编码器和 ...
- 关于git被误删除的分支还原问题
在开发过程中, 有可能会将正在开发的本地分支误删, 本地分支被删除时, 如果已经将本地分支的变更推送到了远端, 还没有问题, 如果被删除的本地分支只提交了没有推送到远端, 就悲剧了, 相当于在你上一次 ...
- E - Lovely Palindromes
Description Pari has a friend who loves palindrome numbers. A palindrome number is a number that rea ...
- 3.7-3.10 Hive 企业使用优化1
一.Fetch Task 在执行hive代码的时候,一条简单的命令大部分都会转换成为mr代码在后台执行, 但是有时候我们仅仅只是想获取一部分数据而已,仅仅是获取数据,还需要转化成为mr去执行吗? 那个 ...
- Installing cmake 2.8.8 or higher on Ubuntu 12.04 (Precise Pangolin) (转载)
转自:http://cameo54321.blogspot.com/2014/02/installing-cmake-288-or-higher-on.html Check the version o ...