题目描述:

布丁怪这一款游戏是在一个n×n 的矩形网格中进行的,里面有n个网格有布丁怪,其它的一些格子有一些其它的游戏对象。游戏的过程中是要在网格中移动这些怪物。如果两个怪物碰到了一起,那么他们就会变成一个更大的怪物。(谁叫他们是布丁呢?)

据统计,如果每一行每一列都只有一个布丁怪,那么这样的布局是比较吸引玩家的。

所以为了产生多种多样的有趣布局,我们会从一个 n×n 的有趣的地图中选取一个k×k (1≤k≤n)子矩形作为地图,而且这个子地图中恰好有k个布丁怪。

现在请你计算一下一个n×n 的有趣布局中,有多少种子地图是有趣的。

解题报告:

用时3h,2WA

这一题开始想着优化\(O(n^2)\)的暴力,并没有成功,然后请教大佬,得知是分治,然后花了3h才弄出这个分治,分治函数里必须数线性的,所以考虑怎么算贡献,发现只需要讨论最大值和最小值分别再\((l,mid)\)还是\((mid+1,r)\)

首先是全部在左边的,那么就可以确定右端点的位置,全在右边的同理

难点在于分别在左右两端的:

我们考虑左边是最小值,右边是最大值

那么对于\(R-L=Max-Min\)这个式子我们可以拆成:\(R-Max=L-Min\)就可以把\(R-Max\)放进桶里,然后统计\(L-Min\)即可,然后我就傻逼的放进了桶里,并没有维护左边最小值小于右边最小值,左边最大值小于右边最大值这两个条件,然后答案大了许多,所以要开两个单调指针维护左边最小值小于右边最小值,左边最大值小于右边最大值这两个条件,注意数组要偏移

对于左边是最大值,右边是最小值的情况同理:

维护\(R+Min=L+Max\)即可

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=4e5+5;
struct node{
int x,y;
bool operator <(const node &r)const{
return x<r.x;
}
}a[N];
int n,L[N],R[N],t[N*3],mov=N;long long ans=0;
void solve(int l,int r){
if(l==r){
ans++;
return ;
}
int mid=(l+r)>>1;
solve(l,mid);solve(mid+1,r);
L[mid]=a[mid].y,R[mid]=a[mid].y;
for(int i=mid-1;i>=l;i--){
L[i]=Min(L[i+1],a[i].y);
R[i]=Max(R[i+1],a[i].y);
}
L[mid+1]=a[mid+1].y;R[mid+1]=a[mid+1].y;
for(int i=mid+2;i<=r;i++){
L[i]=Min(L[i-1],a[i].y);
R[i]=Max(R[i-1],a[i].y);
}
int j,k;
for(int i=mid;i>=l;i--){
k=R[i]-L[i]+1;
j=mid+(k-(mid-i+1));
if(j<=mid || j>r)continue;
if(R[j]>=L[i] && R[j]<=R[i] && L[j]>=L[i] && L[j]<=R[i])
ans++;
}
for(int i=mid+1;i<=r;i++){
k=R[i]-L[i]+1;
j=mid-(k-(i-mid+1));
if(j>=mid+1 || j<l)continue;
if(R[j]>=L[i] && R[j]<=R[i] && L[j]>=L[i] && L[j]<=R[i])
ans++;
}
int pr=mid+1,pl=mid+1;
for(int i=mid;i>=l;i--){
while(pr<=r && L[i]<L[pr])t[R[pr]-pr+mov]++,pr++;
while(pl<pr && R[i]>R[pl])t[R[pl]-pl+mov]--,pl++;
ans+=t[L[i]-i+mov];
}
for(int i=pl;i<pr;i++)t[R[i]-i+mov]--;
pr=mid;pl=mid;
for(int i=mid+1;i<=r;i++){
while(pr>=l && L[i]<L[pr])t[R[pr]+pr]++,pr--;
while(pl>pr && R[i]>R[pl])t[R[pl]+pl]--,pl--;
ans+=t[L[i]+i];
}
for(int i=pl;i>pr;i--)t[R[i]+i]--;
}
void work()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i].x,&a[i].y);
}
sort(a+1,a+n+1);
solve(1,n);
printf("%lld\n",ans);
} int main()
{
work();
return 0;
}

51Nod 1555 布丁怪的更多相关文章

  1. 【51Nod1555】布丁怪

    [51Nod1555]布丁怪 题面 51Nod 题目大意: 给你一个\(n\times n\)的棋盘以及\(n\)个棋子,每个棋子坐标为\((x_i,y_i)\),保证棋盘的每一行或一列都有且仅有一个 ...

  2. 题解[51nod1555] 布丁怪

    题解[51nod1555] 布丁怪 题面 解析 本文参考这位dalao的题解 首先有一个巧妙的转换, 开一个数组记录每个横坐标的纵坐标, 简单来说就是对于点(x,y),令a[x]=y. 于是问题就变成 ...

  3. Codeforces 436D Pudding Monsters

    题意简述 开始有无限长的一段格子,有n个格子种有布丁怪兽,一开始连续的布丁怪兽算一个布丁怪兽. 每回合你可以将一个布丁怪兽向左或右移动,他会在碰到第一个布丁怪兽时停下,并与其合并. 有m个特殊格子,询 ...

  4. [CF436D]Pudding Monsters

    题目大意:有一个长度为$2\times 10^5$的板,有$n(n\leqslant 10^5)$个格子$a_1,\dots,a_n$有布丁怪兽,一开始连续的怪兽算一个怪兽,有$m(m\leqslan ...

  5. 51nod 2589 快速讨伐

    51nod 如果不考虑升级操作,只有买装备操作和打怪操作,那么首先一定要先买装备,然后可以打死1级的怪,这些怪被打死的时间只要在第一次买装备后面好了,因为现在总操作是\(n+\sum a_i\)个,所 ...

  6. 【51Nod 1244】莫比乌斯函数之和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...

  7. 51Nod 1268 和为K的组合

    51Nod  1268  和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...

  8. 51Nod 1428 活动安排问题

    51Nod   1428  活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...

  9. 51Nod 1278 相离的圆

    51Nod 1278 相离的圆 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1278 1278 相离的圆 基 ...

随机推荐

  1. 构建微服务开发环境3————Java应用的优秀管理工具Maven的下载安装及配置

    [内容指引] 下载安装包: MacOS下Maven的安装及配置: Windows下Maven的安装及配置. 一.下载安装包 进入Maven的官方下载地址:http://maven.apache.org ...

  2. 为微软samples-for-ai贡献代码是种怎么样的体验?

    推送原文链接:传送门 关注SomedayWill,了解为微软项目贡献代码的始终. 还记得微软神器samples-for-ai吗?它可不仅仅可以用来安装框架,它其实是个开源的AI样例库,以Visual ...

  3. 爬虫小探-Python3 urllib.request获取页面数据

    使用Python3 urllib.request中的Requests()和urlopen()方法获取页面源码,并用re正则进行正则匹配查找需要的数据. #forex.py#coding:utf-8 ' ...

  4. TP框架关于模版的使用技巧

    1.

  5. babel基本用法

    babel-cli babel-cli是本地使用编译js文件 1.安装: cnpm i babel-cli babel-preset-env -D 2.配置packjson: "script ...

  6. jupyter notebook下python2和python3共存(Ubuntu)

    提示NOTICE 时间:2018/04/06 主题:Ubuntu 下CAFFE框架 主角:Jupyter Notebook 简介: Jupyter Notebook(此前被称为 IPython not ...

  7. js 过多 导致页面加载过慢

    自己的代码检查了很久,才检查 出来 通常我们的网站里面会加载一些js代码,统计啊,google广告啊,百度同盟啊,阿里妈妈广告代码啊, 一堆,最后弄得页面加载速度很慢,很慢. 解决办法:换一个js包含 ...

  8. istio入门(01)istio是什么?

  9. 新概念英语(1-137)A pleasant dream

    Lesson 137 A pleasant dream 美好的梦 Listen to the tape then answer this question. What would Julie like ...

  10. Spark入门(1-5)Spark统一了TableView和GraphView

    下面我们看一下图计算的简单示例: 从图我们可以看出, 拿到Wikipedia的文档后,我们可以: 1.Wikipedia的文档 -- > table视图 -- >分析Hyperlinks超 ...