4687. 【NOIP2016提高A组8.12】奇袭

Problem

Description

由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上要迎来最终的压力测试——魔界入侵。
唯一一个神一般存在的Administrator被消灭了,靠原本的整合骑士的力量是远远不够的。所以爱丽丝动员了UW全体人民,与整合骑士一起抗击魔族。
在UW的驻地可以隐约看见魔族军队的大本营。整合骑士们打算在魔族入侵前发动一次奇袭,袭击魔族大本营!
为了降低风险,爱丽丝找到了你,一名优秀斥候,希望你能在奇袭前对魔族大本营进行侦查,并计算出袭击的难度。
经过侦查,你绘制出了魔族大本营的地图,然后发现,魔族大本营是一个N×N的网格图,一共有N支军队驻扎在一些网格中(不会有两只军队驻扎在一起)。
在大本营中,每有一个k×k(1≤k≤N)的子网格图包含恰好k支军队,我们袭击的难度就会增加1点。
现在请你根据绘制出的地图,告诉爱丽丝这次的袭击行动难度有多大。

Input

第一行,一个正整数N,表示网格图的大小以及军队数量。
接下来N行,每行两个整数,Xi,Yi,表示第i支军队的坐标。
保证每一行和每一列都恰有一只军队(即每一个Xi和每一个Yi都是不一样的)。

Output

一行,一个整数表示袭击的难度。

Sample Input

5
1 1
3 2
2 4
5 5
4 3

Sample Output

10

Data Constraint

对于30%的数据,N ≤ 100
对于60%的数据,N ≤ 5000
对于100%的数据,N ≤ 50000

Hint

显然,分别以(2,2)和(4,4)为左上,右下顶点的一个子网格图中有3支军队,这为我们的难度贡献了1点。
类似的子网格图在原图中能找出10个。

Solution

我们将问题转化为在N个数中,选择一段区间,使得该区间的数字连续,求方案数。
问题可以继续转化,变成:在1-n中选择连续k个数,且这连续k个数的最大值与最小值的差为k-1,求方案数。
我们可以用分治来解决这个问题。对于区间[l,r],
ans(l,r)=ans(l,mid)+ans(mid+1,r)+穿midk
对于一个合法的区间 [l,r] ,一定有: max[mid+1,r]min[l,mid]=rl
4687. 【NOIP2016提高A组8.12】奇袭_第1张图片
这时出现两种情况:
①最大值和最小值同侧②最大值和最小值异侧。
我们先定义mil[x]为区间[x,mid]的最小值,mal[x]为区间[x,mid]的最大值,mir[x]为区间[mid+1,x]的最小值,mar[x]为区间[mid+1,x]的最小值。
首先分析情况①
我们假设求最小值都在左边的情况。
假设区间[i,j]合法(穿过mid),那么i在左边,
j=mal[i]mil[i]+i ,且 j[mid+1,r]mir[j]>mil[i]mar[j]<mal[i] 。否则不合法。
最小值都在右边的情况自己考虑。
然后分析情况②
我们先考虑最小值在左边,最大值在右边的这种情况。
我们从左到右枚举位置i,再设定两个指针z1,z2。
4687. 【NOIP2016提高A组8.12】奇袭_第2张图片
此时我们定义一个t数组作为桶,来存合法的情况。我们可以知道:
mar[z1]>mal[i] ,不合法的话就 z1++t[mar[z1]z1] ,直到合法为止;
mil[i]<mir[z2] ,不合法的话就 z2++t[mar[z2]z2]++ ,直到不合法为止。
由于 mil[i]i=mar[j]j ,所以区间[l,r]的答案就是 Σmidi=lt[mil[i]i]
t数组记得要清空。
另一种情况自己想。
——2016.8.18

你可能感兴趣的:(4687. 【NOIP2016提高A组8.12】奇袭)