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

在UnderWorld中,为了计算奇袭魔族大本营的难度,需要在N×N网格图中找到所有包含恰好k支军队的k×k子网格,每找到一个难度增加1。本文提供了一种解决方案,通过将问题转化为选择连续区间的问题,并使用分治法求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
这里写图片描述
这时出现两种情况:
①最大值和最小值同侧②最大值和最小值异侧。
我们先定义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。
这里写图片描述
此时我们定义一个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值