[***]HZOJ 奇袭
C. 奇袭
题目描述
由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上 要迎来最终的压力测试——魔界入侵。
唯一一个神一般存在的Administrator被消灭了,靠原本的整合骑士的力量 是远远不够的。所以爱丽丝动员了UW全体人民,与整合骑士一起抗击魔族。
在UW的驻地可以隐约看见魔族军队的大本营。整合骑士们打算在魔族入侵前 发动一次奇袭,袭击魔族大本营!
为了降低风险,爱丽丝找到了你,一名优秀斥候,希望你能在奇袭前对魔族 大本营进行侦查,并计算出袭击的难度。
经过侦查,你绘制出了魔族大本营的地图,然后发现,魔族大本营是一个N ×N的网格图,一共有N支军队驻扎在一些网格中(不会有两只军队驻扎在一起)。
在大本营中,每有一个k×k(1≤k≤N)的子网格图包含恰好k支军队,我们袭 击的难度就会增加1点。
现在请你根据绘制出的地图,告诉爱丽丝这次的袭击行动难度有多大。
输入格式
第一行,一个正整数N,表示网格图的大小以及军队数量。
接下来N行,每行两个整数,Xi,Yi,表示第i支军队的坐标。
保证每一行和每一列都恰有一只军队,即每一个Xi和每一个Yi都是不一样 的。
输出格式
一行,一个整数表示袭击的难度。
样例
样例输入
5
1 1
3 2
2 4
5 5
4 3
样例输出
10
数据范围与提示
样例解释
显然,分别以(2,2)和(4,4)为左上,右下顶点的一个子网格图中有3支军队,这为我们的难度贡献了1点。类似的子网格图在原图中能找出10个。
数据范围
对于30%的数据,N ≤ 100
对于60%的数据,N ≤ 5000
对于100%的数据,N ≤ 50000
一道及其神仙的题,考试时只想到了暴力,复杂度$n^3log^2n$,用二维树状数组记录前缀和(有什么意义……),最后T27(说好30呢……)。
LL ans=;
for(int k=;k<n;k++)
for(int i=;i<=n-k+;i++)
for(int j=;j<=n-k+;j++)
if(ask(i+k-,j+k-)-ask(i-,j+k-)-ask(i+k-,j-)+ask(i-,j-)==k)ans++;
printf("%lld\n",ans+n+);
然后是$n^2$的方法,由于x,y没有重复,我们把x当作数组下标,就转化成了一维的,那么问题就转化成了:对于a数组,有多少个区间[L,R]满足区间是连续一段数(可以是乱序),进而转化为了:有多少个区[L,R] 满足max(a[L],……a[R])-min(a[L],……,a[R])=R-L,复杂度$n^2$,代码实现:
LL ans=,ma=-0x7fffffff,mi=0x7fffffff;
for(int L=;L<=n;L++)
{
ma=-0x7fffffff,mi=0x7fffffff;
for(int R=L;R<=n;R++)
{
ma=max(ma,h[R]),mi=min(mi,h[R]);
if(R-L==ma-mi)ans++;
}
}
然后就是及其神仙的$nlogn$正解了:
分治,区间[L,R]的答案=[L,mid]+[mid+1,R]+跨mid的答案,对于前两种直接递归到L=R return 1即可,主要是最后一种。
首先预处理出[L,mid]中的各个点i,区间[i,mid]的最大值和最小值,以及区间[mid+1,R]中各个点i,区间[mid+1,i]的最大值和最小值(注意mid+1)。以下ma[i],如果i<=mid,则表示[i,……,mid]最大值,否则表示[mid+1,……,i]最大值,mi[i]同理。
代码实现:
ma[mid]=mi[mid]=h[mid];
for(int i=mid-;i>=L;i--)
mi[i]=min(mi[i+],h[i]),
ma[i]=max(ma[i+],h[i]);
ma[mid+]=mi[mid+]=h[mid+];
for(int i=mid+;i<=R;i++)
mi[i]=min(mi[i-],h[i]),
ma[i]=max(ma[i-],h[i]);
跨区间的答案分两种情况:
1.这个区间的最小值和最大值都在[L,mid]段,但是这个区间的跨mid,枚举区间左端点,由$r-l=ma[l,r]-mi[l,r]$并且最大值最小值都在[L,mid]段,所以$r-l=ma[l]-mi[l]$,枚举左端点,则r=l+ma[l]-mi[l],判断r
是否符合条件,若符合,ans++,不符合的情况:r>R,r<=mid(因为要跨区间),mi[r]<mi[l](这样最小值就不在左边了),ma[r]>mi[l]同理。
for(int l=L;l<=mid;l++)
{
int r=ma[l]-mi[l]+l;
if(r>R)continue;
if(r<=mid)continue;
if(ma[r]>ma[l])continue;
if(mi[r]<mi[l])continue;
ans++;
}
代码实现
2.这个区间的最小值和最大值都在[mid+L,R]段,这个区间跨mid,枚举区间又端点即可,同上。
3.区间最小值在[L,mid],最大值在[mid+1,R],则满足$ma[r]-mi[l]=r-l$,移项得$ma[r]-r=mi[l]-l$,此时式子的左右两边就没有什么关系了,然后用到了和BSGS相似的思路,将ma[i]-i放在桶里(即把其当作数组下标),通过两个指针,r1=r2=mid+1,ma与mi是严格单调的,首先将r1(r1<=R)不断++,若满足mi[r1]>mi[L],则tong[ma[r1]-r1]++,对于整个[L,mid],这些都是满足mi[r1]>mi[L],即保证最小值在左区间,然后将r2不断++,若满足ma[r2]<ma[L],则tong[ma[r2]-r1]--,因为此时不满足最大值在右区间。此时tong中的数值都会满足ma[i]>ma[L],mi[i]<mi[L],然后我们就可以统计答案了,枚举左端点l,ans+=tong[mi[l]-l](mi[l]-l=ma[r]-r),但是这样就够了吗?并不够,因为桶中的数据是满足ma[i]>ma[L],mi[i]<mi[L],但是由于是从左到右枚举左端点,我们只需要它满足ma[i]>ma[l]&&mi[i]<ma[l]即可,而ma,mi是单调的,显然ma[l]<=ma[L],mi[l]>=mi[L],随着l的枚举,ma[l]会越来越小,mi[l]则会越来越大,符合条件$mi[r1]>mi[L],ma[r2]>ma[L]$的会越来越多,所以r1,r2还要继续移动,将在l-1时不符合条件但是在l时符合条件的放进去,然后就可以ans+=tong[mi[l]-l]了。有几个小细节要注意,考虑到ma[i]-i会出负数,所以tong下标要+n(当然你也可以用指针进行一些骚操作使负数合法),tong不要memset,其实不会影响正确性只是会T27……
还有就是如果tong的值是负数时就不要加了,判断的时候要写if(...>0)(不要像我一样沙雕地不写>0,非0为真,负数也为真)。
int r1=mid+,r2=mid+;
while(r1<=R&&mi[L]<mi[r1])
{
tong[n+ma[r1]-r1]++;
r1++;
}
while(r2<=R&&ma[L]>ma[r2])
{
tong[n+ma[r2]-r2]--;
r2++;
}
for(int l=L;l<=mid;l++)
{
while(r1>mid+&&mi[r1-]<mi[l])
r1--,tong[n+ma[r1]-r1]--;
while(r2>mid+&&ma[r2-]>ma[l])
r2--,tong[n+ma[r2]-r2]++;
if(tong[n+mi[l]-l]>)ans+=tong[n+mi[l]-l];
}
for(int i=mid+;i<=R;i++)tong[n+ma[i]-i]=;
代码实现
4.最大值在左边最小值在右边的情况,和上边就很类似了,只是式子要换一下,$ma[l]-mi[r]=r-l$,移项得$ma[l]+l=mi[r]+r$,其余的就大概相同了。
当然你也可以用一下黑科技区间反转,但是要判断一下mid。
[***]HZOJ 奇袭的更多相关文章
- [JZOJ4687]奇袭
[JZOJ4687]奇袭 题目 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上要迎来最终的压力测试——魔界入侵. 唯一一个神一般存在的Administrator被消灭 ...
- 奇袭(单调栈+分治+桶排)(20190716 NOIP模拟测试4)
C. 奇袭 题目类型:传统 评测方式:文本比较 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而 ...
- 9.5 考试 第三题 奇袭题解(codeforce 526f)
问题 C: 奇袭 时间限制: 1 Sec 内存限制: 256 MB 题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上 要迎来最终的压力测试——魔界入侵. 唯 ...
- 7.16 NOIP模拟测试4 礼物+通讯+奇袭
T1 礼物 题目大意:n个物品,每次有pi的概率买到,可以重复买,也可以什么都没买到,但算一次购买,问把所有东西都买到的期望次数.对于10%的数据,N = 1;对于30%的数据,N ≤ 5;对于100 ...
- 【NOIP2016提高A组8.12】奇袭
题目 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上要迎来最终的压力测试--魔界入侵. 唯一一个神一般存在的Administrator被消灭了,靠原本的整合骑士的力量 ...
- 模拟4题解 T3奇袭
T3奇袭 题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上 要迎来最终的压力测试——魔界入侵. 唯一一个神一般存在的Administrator被消灭了,靠原本 ...
- 非确定性有穷状态决策自动机练习题Vol.2 C. 奇袭
非确定性有穷状态决策自动机练习题Vol.2 C. 奇袭 题目描述 由于各种原因,桐人现在被困在\(Under World\)(以下简称\(UW\))中,而\(UW\)马上 要迎来最终的压力测试--魔界 ...
- NOIP模拟测试4「礼物·通讯·奇袭」
礼物. 首先见到期望一定要想dp,看到n的范围无脑想状压, 然后我就只想到这了. dp方程式还是比较好想的,但是我依然想不出来 略经思考 颓题解 依然不会,随便写了个式子 i状态中不含j $f[i ...
- hzoj 2301(莫比乌斯反演)
题意 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公 数. 思路: 与先前的那个相比,这次a,c并不一定 ...
随机推荐
- MySQL--修改Mac中的默认编码
1.在终端中进入到etc目录下 2.打开etc目录下的my.cnf文件(如果这样修改不了的就要提高用户权限, 可以尝试使用sudo来打开文件) 3.将一下内容添加到my.cnf文件中 [client] ...
- 【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]
以题写模板. 写了两个:n^2版本与nlogn版本 P1091 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队 ...
- tomcat标准化安装
操作系统说明: 操作系统 版本 linux red hat release 6.4 关键软件包说明: 软件包 版本 目录 运行用户 jdk-7u79-linux-x64.gz 1.7 /usr/loc ...
- web前端学习(三)css学习笔记部分(7)-- 文字和字体相关样式、盒子相关样式、背景与边框相关样式
12. 文字和字体相关样式 12.1 CSS3 给文字添加阴影 使用 text-shadow 属性给页面上的文字添加阴影效果,text-shadow 属性是在CSS2中定义的,在 CSS2.1 中 ...
- CSS-DOM的小知识(二)
上篇文章说到,通过element.style.property可以获得元素的样式,但是style属性只能够返回内嵌样式,对于外部样式表的样式和head中的style样式都无法获取,这就限制了此方法的使 ...
- loadrunner录制脚本时登录密码转md5
在录制用户注册登录脚本时,常常会遇到web程序对用户密码进行加密处理.在很多时候采用的加密方式为MD5. 这时有两种处理方式: 一.所有用户采用同一密码 例如:每个用户名的密码都为e10adc3949 ...
- FatMouse' Trade (贪心)
#include <iostream> #include <stdio.h> #include <cstring> #include <cmath> # ...
- 【JZOJ5093】【GDSOI2017第四轮模拟day3】字符串匹配 哈希
题面 对于一个字符集大小为C的字符串P,我们可以将任意两种字符在P中的位置进行互换,例如P=abcba,我们交换a,b就变为bacab,交换a,d就变为dbcbd,交换可以进行任意次.若交换后P变为了 ...
- Codeforces Round #189 (Div. 2) A. Magic Numbers【正难则反/给出一个数字串判断是否只由1,14和144组成】
A. Magic Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- JSP Web第七章整理复习 Servlet基础知识
P206-208 Servlet项目的创建,web.xml的配置及标签含义,相关程序 创建:new 一个Servlet类,继承自javax.servlet.http.HttpServlet; 写doG ...