题解[51nod1555] 布丁怪

题面

解析

本文参考这位dalao的题解

首先有一个巧妙的转换,

开一个数组记录每个横坐标的纵坐标,

简单来说就是对于点(x,y),令a[x]=y.

于是问题就变成了求满足区间最大值与最小值的差恰好等于区间长度的区间数.

于是可以考虑分治不要问我怎么想到的

设当前区间为l,r,中点为mid.

mx[i]=i~mid的最大值(l<=mid),mid+1到i的最大值(i>mid)

mn[i]同理.

分情况讨论:

1.区间最大值和最小值都在左边.

设右端点为j,这时候j要满足mn[j+1]<mn[i]或mx[j+1]>mx[i],否则j+1也在mn~mx这个范围里面,j肯定不能是端点.

然后再看j-i是否等于mx[i]-mn[i].

2.最大值在左边,最小值在右边.

因为mx和mn都是单调的,所以拿两个指针L和R维护满足要求的右端点,

然后设右端点为j,则mx[i]-mn[j]=j-i,

即mx[i]+i=mn[j]+j,

开个桶维护一下就行了.

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
using namespace std; inline int read(){
int sum=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return f*sum;
} const int N=1000005;
int n,a[N];ll ans,cnt[N];
int mx[N],mn[N]; inline void work(int l,int r,int m){
mx[m]=mn[m]=a[m];
for(int i=m-1;i>=l;i--){
mx[i]=max(mx[i+1],a[i]);
mn[i]=min(mn[i+1],a[i]);
}
mx[m+1]=mn[m+1]=a[m+1];
for(int i=m+2;i<=r;i++){
mx[i]=max(mx[i-1],a[i]);
mn[i]=min(mn[i-1],a[i]);
}
int L=m+1,R=m,j=m;
for(int i=m;i>=l;i--){
while(j<r&&mx[j+1]<mx[i]&&mn[j+1]>mn[i]) j++;
if(mx[i]-mn[i]==j-i&&j>m) ans++;
while(R<r&&mx[R+1]<mx[i]) R++,cnt[R+mn[R]]++;
while(L<=r&&mn[L]>mn[i]) cnt[L+mn[L]]--,L++;
if(L<=R) ans+=cnt[i+mx[i]];
}
while(L<=r) cnt[L+mn[L]]--,L++;
while(R<r) R++,cnt[R+mn[R]]++;
} inline void solve(int l,int r){
if(l==r){ans++;return ;}
int mid=(l+r)>>1;
solve(l,mid);solve(mid+1,r);
work(l,r,mid);
reverse(a+l,a+r+1);
if((r-l+1)%2) mid--;
work(l,r,mid);
reverse(a+l,a+r+1);
} signed main(){
n=read();
for(int i=1;i<=n;i++)
{int x=read();a[x]=read();}
solve(1,n);
printf("%lld\n",ans);
return 0;
}

题解[51nod1555] 布丁怪的更多相关文章

  1. 【51Nod1555】布丁怪

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

  2. 51Nod 1555 布丁怪

    题目描述: 布丁怪这一款游戏是在一个n×n 的矩形网格中进行的,里面有n个网格有布丁怪,其它的一些格子有一些其它的游戏对象.游戏的过程中是要在网格中移动这些怪物.如果两个怪物碰到了一起,那么他们就会变 ...

  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. ETO的公开赛T3《寻星》 题解(BY 超級·考場WA怪 )

    题解 寻星 题意:给定一个有向带权图,定义从一点到另一点的某条路径长为路径上所有边权的最大值,并给定四个点编号w,t1,t2,t3. 求出一个点s,使它在到t1,t2,t3三点最短路径最大值最大或者根 ...

  6. 虎符ctf-MISC-奇怪的组织(看完官方题解,找到了)

    一道取证题,一整场比赛,基本就死磕了这一题 写的很乱,因为当时的思维就是那么乱,完全没有注意到出题人的提示, 还没做出来,没有找到关键key 那个人的real name 文档:虎符.note链接:ht ...

  7. 洛谷 P3201 梦幻布丁 题解

    (这篇题解可能没什么营养,主要是记录一下我用map乱搞启发式合并的神奇做法) 首先我们知道,我们肯定要用一堆集合维护每一种数当前的位置,并支持合并和数连续出现的段数两种操作 我发现这个东西并不好搞,但 ...

  8. noip2000提高组题解

    事实再次向我证明了RP的重要性... 第一题:进制转换 是我最没有把握AC的一道题目却是我唯一一道AC的题目,真是讽刺.看完题目几乎完全没有往正常的解法(取余倒序)去想,直接写了搜索,因为数据范围在2 ...

  9. [HNOI2009]梦幻布丁 算法技巧之邻接链

    题目描述 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. 输入输出格式 输入格式: 第 ...

随机推荐

  1. springboot之Redis

    1.springboot之Redis配置 在学习springboot配置Redis之前先了解Redis. 1.了解Redis Redis简介: redis是一个key-value存储系统.和Memca ...

  2. java8 time包的简单使用

    import com.sun.org.apache.xml.internal.res.XMLErrorResources_tr; import java.text.DateFormat; import ...

  3. oracle如何保证数据一致性和避免脏读

      oracle通过undo保证一致性读和不发生脏读 1.不发生脏读2.一致性读3. 事务槽(ITL)小解 1.不发生脏读 例如:用户A对表更新了,没有提交,用户B对进行查询,没有提交的更新不能出现在 ...

  4. Python学习-55 小游戏- 猜大小

    #游戏开始,首先玩家选择大小,选择完成后开始摇骰子(11<=总值<=18为大,3<=总值<=10为小) import random def roll_dice(numbers= ...

  5. Redis string操作命令

    字符串类型  string set 从v2.6.12版本开始,Redis增强了set功能, 语法如下: SET key value [EX seconds] [PX milliseconds] [NX ...

  6. 如何将本地的项目添加到github上

    参考链接:http://note.youdao.com/noteshare?id=d0b7990a83b024b0172b6d5c5617a8d0&sub=659F216B9046420991 ...

  7. PowerBuilder学习笔记之2PowerScript语言(三)

    教材地址:https://wenku.baidu.com/view/1e82d26925c52cc58ad6be05.html?sxts=1565679996440 2.6嵌入式SQL语句 2.6.1 ...

  8. Delphi XE10.1 引用计数(Delphi XE10.1 Berlin终于增加了对接口的Weak, UnSafe的支持)

    以往的Delphi版本,不支持接口的Weak,和UnSafe的引用,支持对象的Weak, UnSafe,而且仅在Android和Ios平台上支持. 现在Delphi XE10.1 Berlin终于增加 ...

  9. GRPC代替webapi Demo。

    gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架. gRPC 的主要优点是: 现代高性能轻量级 RPC 框架. 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现. 可用 ...

  10. Win7下搭建Go语言开发环境

    Win7下搭建Go语言开发环境 1 下载适合window版本的Go安装包,下载地址http://code.google.com/p/go/downloads/list 2 下载适合window本本的L ...