【NOIP2016提高A组8.12】奇袭
题目
由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上要迎来最终的压力测试——魔界入侵。
唯一一个神一般存在的Administrator被消灭了,靠原本的整合骑士的力量是远远不够的。所以爱丽丝动员了UW全体人民,与整合骑士一起抗击魔族。
在UW的驻地可以隐约看见魔族军队的大本营。整合骑士们打算在魔族入侵前发动一次奇袭,袭击魔族大本营!
为了降低风险,爱丽丝找到了你,一名优秀斥候,希望你能在奇袭前对魔族大本营进行侦查,并计算出袭击的难度。
经过侦查,你绘制出了魔族大本营的地图,然后发现,魔族大本营是一个N×N的网格图,一共有N支军队驻扎在一些网格中(不会有两只军队驻扎在一起)。
在大本营中,每有一个k×k(1≤k≤N)的子网格图包含恰好k支军队,我们袭击的难度就会增加1点。
现在请你根据绘制出的地图,告诉爱丽丝这次的袭击行动难度有多大。
分析
想到,可以把题目简化为在一段数中,选择一段区间,使的该区间的数连续,求方案数。
接着可以进一步转换为在一段数中,选择相邻k个数,使得这k个数中的最大值减去最小值等于k-1,求方案数。
然后考虑如何解决这个问题。
我们用分治的思想。
对于一段区间,左边界为l,右边界为r
那么这一段区间的答案\(ans(l,r)=ans(l,mid)+ans(mid+1,r)+这k个数穿过mid的方案数\)
首先知道一个合法的区间\([i,j]\),\(j-i=区间[i,j]中的最大值-区间[i,j]中的最小值\)
这里分两种情况:
最大最小值都在同一侧
现在假设都在左侧的情况,即在区间\([l,mid]\)中。右侧的情况自己思考。
先定义:
mal[x]:表示区间[x,mid]中的最大值(x在区间[l,mid]中)
mil[x]:表示区间[x,mid]中的最小值(x在区间[l,mid]中)
mar[x]:表示区间[mid+1,x]中的最大值(x在区间[mid+1,r]中)
mir[x]:表示区间[mid+1,x]中的最小值(x在区间[mid+1,r]中)
我们枚举一个i,i从mid向l移动。设j为区间的右边界
因为最大最小值都在左侧,
根据合法区间的定义,
可以轻松求出j,\(j=i+mal[i]-mil[i]\),
但是j不一定是合法的,
1、j必须在区间\([mid+1,r]\)之间
2、mar[j]必须小于mal[i],mir[j]必须大于mil[i],否则最大最小值就不都在左侧了。
右侧的情况类似。
最大最小值在异侧
现在假设最大值在右侧,即在区间\([mid+1,r]\)中;现在假设最小值在右侧,即在区间\([l,mid]\)中。
我们同样枚举一个i,i从mid向l移动。设j为区间的右边界
我们再定义两个指针z和z1从mid+1向r移动。
因为最大值在右侧,所以mal[i]应该小于mar[z],那么当mal[i]>mar[z]时,将指针z向右移;因为mal和mar都是单调的,对于当前的i,因为区间mar[z-1]一定小于mal[i],都是不合法的。
又因为最小值在左侧,所以mil[i]应该小于mir[z1],那么当mir[z1]>mil[i]时,将指针z1向右移;因为mil和mir也都是单调的,对于当前的i,因为区间mir[z1-1]一定大于mil[i],都是合法的。
于是区间[z,z1]中的数都有可能是合法的j。
再根据合法区间的定义,移项得到\(mil[i]-i=mar[j]-j\)
定义一个桶t[],
那么当z移动时,经过的点都是不合法的,就将t[mar[z]-z]减去一;
那么当z1移动时,经过的点都是合法的,就将t[mar[z1]-z1]加上一。
最后,将ans加上t[mil[i]-i]。
桶记住要清零。
另一种情况自己考虑。
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
const int mo=1000000007;
const int N=50005;
using namespace std;
int a[N*2],n,mal[N*2],mar[N*2],mil[N*2],mir[N*2],t[N*5],j,z,z1;
int solve(int l,int r)
{
int mid=(l+r)/2,ans=0;
if(l!=r) ans=solve(l,mid)+solve(mid+1,r);
else return 1;
for(int i=l;i<=r;i++) mar[i]=mal[i]=0,mir[i]=mil[i]=maxlongint;
for(int i=mid;i>=l;i--)
{
mil[i]=min(mil[i+1],a[i]);
mal[i]=max(mal[i+1],a[i]);
}
for(int i=mid+1;i<=r;i++)
{
mir[i]=min(mir[i-1],a[i]);
mar[i]=max(mar[i-1],a[i]);
}
//极值都在左边
for(int i=mid;i>=l;i--)
{
j=i+mal[i]-mil[i];
if((j<=mid) || (j>r)) continue;
if(mal[i]>mar[j] && mil[i]<mir[j]) ans++;
}
//极值都在右边
for(int i=mid+1;i<=r;i++)
{
j=i-mar[i]+mir[i];
if((j>=mid+1) || (j<l)) continue;
if(mar[i]>mal[j] && mir[i]<mil[j]) ans++;
}
//min在左,max在右
z=z1=mid+1;
for(int i=mid;i>=l;i--)
{
while(z<=r && mar[z]<mal[i])
{
t[mar[z]-z+N]--;
z++;
}
while(z1<=r && mir[z1]>mil[i])
{
t[mar[z1]-z1+N]++;
z1++;
}
if(t[mil[i]-i+N]>=0)
ans+=t[mil[i]-i+N];
}
for(int i=mid+1;i<=r;i++) t[mar[i]-i+N]=0;
//max在左,min在右
z=z1=mid+1;
for(int i=mid;i>=l;i--)
{
while(z1<=r && mir[z1]>mil[i])
{
t[mir[z1]+z1+N]--;
z1++;
}
while(z<=r && mal[i]>mar[z])
{
t[mir[z]+z+N]++;
z++;
}
if(t[mal[i]+i+N]>=0)
ans+=t[mal[i]+i+N];
}
for(int i=mid+1;i<=r;i++) t[mir[i]+i+N]=0;
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
a[x]=y;
}
printf("%d",solve(1,n));
}
【NOIP2016提高A组8.12】奇袭的更多相关文章
- [JZOJ4685] 【NOIP2016提高A组8.12】礼物
Description 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生日礼物.商店里一共有种礼物.夏川每得到一种礼物,就会获得相应喜悦值Wi(每种礼物的喜悦值不能重复获得).每次, ...
- 【NOIP2016提高A组8.12】礼物
题目 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生日礼物. 商店里一共有种礼物.夏川每得到一种礼物,就会获得相应喜悦值Wi(每种礼物的喜悦值不能重复获得). 每次,店员会按照一定 ...
- 【NOIP2016提高A组8.12】总结
惨败!!!! 第一题是一道神奇的期望问题. 第二题,发现"如果两个部门可以直接或间接地相互传递消息(即能按照上述方法将信息由X传递到Y,同时能由Y传递到X),我们就可以忽略它们之间的花费&q ...
- 【NOIP2016提高A组8.12】通讯
题目 "这一切都是命运石之门的选择." 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短信,并由此得知了伦太郎制作出了电话微波炉(仮). 为了掌握时间机器的技术 ...
- JZOJ 4732. 【NOIP2016提高A组模拟8.23】函数
4732. [NOIP2016提高A组模拟8.23]函数 (Standard IO) Time Limits: 1500 ms Memory Limits: 262144 KB Detailed ...
- JZOJ 【NOIP2016提高A组集训第16场11.15】兔子
JZOJ [NOIP2016提高A组集训第16场11.15]兔子 题目 Description 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3 ...
- JZOJ 【NOIP2016提高A组集训第16场11.15】SJR的直线
JZOJ [NOIP2016提高A组集训第16场11.15]SJR的直线 题目 Description Input Output Sample Input 6 0 1 0 -5 3 0 -5 -2 2 ...
- 【NOIP2016提高A组集训第14场11.12】随机游走
题目 YJC最近在学习图的有关知识.今天,他遇到了这么一个概念:随机游走.随机游走指每次从相邻的点中随机选一个走过去,重复这样的过程若干次.YJC很聪明,他很快就学会了怎么跑随机游走.为了检验自己是不 ...
- 【NOIP2016提高A组集训第14场11.12】随机游走——期望+树形DP
好久没有写过题解了--现在感觉以前的题解弱爆了,还有这么多访问量-- 没有考虑别人的感受,没有放描述.代码,题解也写得歪歪扭扭. 并且我要强烈谴责某些写题解的代码不打注释的人,像天书那样,不是写给普通 ...
随机推荐
- OpenStack Nova 高性能虚拟机之 CPU 绑定
目录 文章目录 目录 前文列表 KVM KVM 的功能列表 KVM 工具集 KVM 虚拟机的本质是什么 vCPU 的调度与性能问题 Nova 支持的 vCPU 绑定 vcpu\_pin\_set 配置 ...
- 快速入门分布式消息队列之 RabbitMQ(3)
目录 目录 前文列表 前言 通道 Channel 一个基本的生产者消费者实现 消费者 生产者 运行结果 应用预取计数 应用 ACK 机制 最后 前文列表 快速入门分布式消息队列之 RabbitMQ(1 ...
- xshell 缺少mfc110u.dll
https://www.microsoft.com/zh-CN/download/details.aspx?id=30679 如果 x64 没有反应,就下载 x86 安装试试,
- adb 性能测试(内存)
内存测试: 1.使用数据线将手机与电脑连接: 2.手机打开待测APP,即打开进程: 3.打开cmd命令,获取设备列表:输入adb devices; 4.进入该设备的shell环境,输入:adb -s ...
- Jmeter---BeanShell 常用的 vars, get, props, put ,log用法
BeanShell介 BeanShell是用Java写成的,一个小型的.免费的.可以下载的.嵌入式的Java源代码解释器,具有对象脚本语言特性.本篇只记录一下基本的使用.有以下五个组件: Beansh ...
- 应用安全 - 无文件式攻击 - 工具型攻击 - PowerShell - 汇总
PowerShell 使用 | 命令 win+r ->powershell #启动Powershell窗口 get-host #查看版本 Get-Host | Select-Object Ver ...
- uwsgi + nginx 部署python项目(一)
uWSGI uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换. 要注意 WSGI / uws ...
- java版微信支付/查询/撤销
最近公司接入微信刷卡支付,网上根本没见到很直接的教程(可能眼拙),一直摸滚打爬,加班加点才走通,忍不了必须写一写 微信 刷卡支付/查询/撤销... 必须要有公众号然后去申请,申请自己去看文档,这里主要 ...
- 【Linux-驱动】驱动策略----信号量
访问共享资源的代码区块叫“临界区”,临界区需要以某种互斥机制加以保护:自旋锁.信号量等.互斥访问:一个执行单元在访问共享资源的时候,其他的执行单元被禁止访问. 信号量:在Liunx中的信号量是一种睡眠 ...
- JS基础篇--JS获取元素的宽高以及offsetTop,offsetLeft等的属性值
$(obj).width()与$(obj).height() $(obj).width()与$(obj).height() :jquery方式获取元素的宽高,不包括滚动条与工具条 $(obj).wid ...