In this problem you will meet the simplified model of game Pudding Monsters.

An important process in developing any game is creating levels. A game field in Pudding Monsters is an n × n rectangular grid, n of its cells contain monsters and some other cells contain game objects. The gameplay is about moving the monsters around the field. When two monsters are touching each other, they glue together into a single big one (as they are from pudding, remember?).

Statistics showed that the most interesting maps appear if initially each row and each column contains exactly one monster and the rest of map specifics is set up by the correct positioning of the other game objects.

A technique that's widely used to make the development process more efficient is reusing the available resources. For example, if there is a large n × n map, you can choose in it a smaller k × k square part, containing exactly k monsters and suggest it as a simplified version of the original map.

You wonder how many ways there are to choose in the initial map a k × k (1 ≤ k ≤ n) square fragment, containing exactly k pudding monsters. Calculate this number.

Input

The first line contains a single integer n (1 ≤ n ≤ 3 × 105) — the size of the initial field.

Next n lines contain the coordinates of the cells initially containing monsters. The i-th of the next lines contains two numbers ri, ci (1 ≤ ri, ci ≤ n) — the row number and the column number of the cell that initially contains the i-th monster.

It is guaranteed that all ri are distinct numbers and all ci are distinct numbers.

Output

Print the number of distinct square fragments of the original field that can form a new map.

Examples

Input
5
1 1
4 3
3 2
2 4
5 5
Output
10

题意:给定N*N的棋盘,以及N个棋子放置情况,保证每一行,每一列只有一个棋子。问现在有多少个子正方形,满足每一行每一列都有一个棋子。

思路:以x坐标为第一关键字,转化为一维数组,如样例(1,4,2,3,5),然后问题就成了有多少个练习子区间[i,j],满足i-j=max-min,棋子max和min是区间最大和最小值。 显然分治可以搞,问题转化为多个子问题:求跨过Mid的区间,满足i-j=max-min。

如何线性地解决子问题:由于max和min都是单调的,我们枚举i或者j,然后验证另外一个是否在当前子区间区间里,同时满足max和min的关系,累加答案。

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn=3e5+;
int mx[maxn],mn[maxn],sum[maxn<<];
int a[maxn],N; ll ans;
void solve(int L,int R)
{
if(L==R){ ans++; return ;}
int Mid=(L+R)/;
solve(L,Mid); solve(Mid+,R);
mx[Mid]=mn[Mid]=a[Mid]; mx[Mid+]=mn[Mid+]=a[Mid+];
for(int i=Mid-;i>=L;i--) mx[i]=max(mx[i+],a[i]);//预处理
for(int i=Mid-;i>=L;i--) mn[i]=min(mn[i+],a[i]);
for(int i=Mid+;i<=R;i++) mx[i]=max(mx[i-],a[i]);
for(int i=Mid+;i<=R;i++) mn[i]=min(mn[i-],a[i]); for(int i=Mid;i>=L;i--){ //都在左测
int j=mx[i]-mn[i]+i;
if(j<=R&&j>Mid&&mx[j]<mx[i]&&mn[j]>mn[i]) ans++;
}
for(int i=Mid+;i<=R;i++){ //都在右侧
int j=i-mx[i]+mn[i];
if(j<=Mid&&j>=L&&mx[j]<mx[i]&&mn[j]>mn[i]) ans++;
}
int j=Mid+,k=Mid+;
for(int i=Mid;i>=L;i--){ //左小右大
while(j<=R&&mn[j]>mn[i]) sum[mx[j]-j+N]++,j++;
while(k< j&&mx[k]<mx[i]) sum[mx[k]-k+N]--,k++;
ans+=(ll)sum[mn[i]-i+N];
}
while(k<j) sum[mx[k]-k+N]--,k++;
j=Mid,k=Mid;
for(int i=Mid+;i<=R;i++){ //左大右小
while(j>=L&&mn[j]>mn[i]) sum[mx[j]+j]++,j--;
while(k> j&&mx[k]<mx[i]) sum[mx[k]+k]--,k--;
ans+=(ll)sum[mn[i]+i];
}
while(k>j) sum[mx[k]+k]--,k--;
}
int main()
{
int x,y,i,j;
scanf("%d",&N);
for(i=;i<=N;i++) scanf("%d%d",&x,&y) ,a[x]=y;
solve(,N);
printf("%lld\n",ans);
return ;
}

CodeForces526F:Pudding Monsters (分治)的更多相关文章

  1. [Codeforces526F]Pudding Monsters 分治

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

  2. 【CF526F】Pudding Monsters cdq分治

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

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

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

  4. CF526F Pudding Monsters

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

  5. 「CF526F」 Pudding Monsters

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

  6. Pudding Monsters CodeForces - 526F (分治, 双指针)

    大意: n*n棋盘, n个点有怪兽, 求有多少边长为k的正方形内恰好有k只怪兽, 输出k=1,...,n时的答案和. 等价于给定n排列, 对于任意一个长为$k$的区间, 若最大值最小值的差恰好为k, ...

  7. [Codeforce526F]:Pudding Monsters(分治)

    题目传送门 题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上要迎来最终的压力测试——魔界入侵.唯一一个神一般存在的Administrator被消灭了,靠原本的 ...

  8. 奇袭 CodeForces 526F Pudding Monsters 题解

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

  9. 【CF526F】Pudding Monsters

    题意: 给你一个排列pi,问你有对少个区间的值域段是连续的. n≤3e5 题解: bzoj3745

随机推荐

  1. iOS -- SKScene类

      SKScene类 继承自 SKEffectNode:SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject ...

  2. Win7下Nginx的安装与配置

    1.  下载nginx1.9.9版本:(版本随时间而变,下载最新即可) http://nginx.org/download/nginx-1.9.9.zip 2. 解压软件到对应位置,并重命名文件夹为n ...

  3. C#制作、打包、签名、发布Activex全过程【转】

    http://www.cnblogs.com/still-windows7/p/3148623.html 一.前言 最近有这样一个需求,需要在网页上面启动客户端的软件,软件之间的通信.调用,单单依靠H ...

  4. [Javascript] Await a JavaScript Promise in an async Function with the await Operator

    The await operator is used to wait for a promise to settle. It pauses the execution of an async func ...

  5. Head First Python 学习笔记-Chapter3:文件读取和异常处理

    第三章中主要介绍了简单的文件读取和简单的异常处理操作. 首先建立文件文件夹:HeadFirstPython\chapter3,在Head First Pythong官方站点下载须要使用的文件:sket ...

  6. 改进后的向量空间模型(VSM)

    我们採用更加形式化的定义,并採用稍大一些的样例来展示怎样使用基于数据集频率的权重.相应于一个给定的词项,其权重使用IDF(逆文档频率)来计算. 为了给每篇文档建立一个相应的向量,能够考虑例如以下定义. ...

  7. react 调用 function 的写法 及 解决 react onClick 方法自动执行

    1.react 调用方法的写法 (1)方式一 onClick={this.getFetchData.bind(this,item.id)} (2)方式二 getFetchData(e){ this.s ...

  8. Atitit.ati&#160;&#160;str&#160;&#160;字符串增强api

    Atitit.ati  str  字符串增强api 1. java StringUtils方法全览 分类: Java2011-11-30 17:22 8194人阅读 评论(2) 收藏 举报 javas ...

  9. LeetCode 第 3 题(Longest Substring Without Repeating Characters)

    LeetCode 第 3 题(Longest Substring Without Repeating Characters) Given a string, find the length of th ...

  10. ubuntu安装交叉编译工具链

    一.sudo su 切换到root用户权限 二.将arm-linux-gcc-4.3.2.tgz从windows拷贝到Linux  /home/ttt/arm-linux-gcc-4.3.2.tgz ...