Codeforces 526 F Pudding Monsters题解(线段树+单调栈)

Codeforces 526F 分治 说实话这题挺简单的(知道题解以后),但是一般人做的时候脑洞不大一点还不一定做得出来。 显然,题目可化简为:给定 N 个数的一个排列,问这个序列中有多少个子区间的数恰好是连续的。 进一步可以化为:有多少种情况使得,相邻的 k 个数中最大值和最小值的差小于等于 k-1。 大致有两种解法,一种是分治,一种是线段树。 这里主要讲一下分治的解法。 考虑分治,对于当前区间[L,R],记区间中点为 mi 阅读详情

题目:CF526F.
题目大意:给定一个 n ∗ n n*n n∗n的矩阵,其中 n n n个坐标有人且每一行和每一列均只有一人,求 k ∗ k k*k k∗k的矩阵中只有 k k k个人的矩阵的数量( k k k可以使任何数,不是常数).
1 ≤ n ≤ 3 ∗ 1 0 5 1\leq n\leq 3*10^5 1≤n≤3∗105.

首先容易把问题转化为求一个序列 a a a中,有多少个子区间 [ l , r ] [l,r] [l,r]满足 max ⁡ i = l r { a i } − min ⁡ i = l r { a i } = r − l \max_{i=l}^{r}\{a_i\}-\min_{i=l}^{r}\{a_i\}=r-l maxi=lr​{ai​}−mini=lr​{ai​}=r−l.

这个问题很容易在 O ( n 2 ) O(n^2) O(n2)的时间复杂度内解决,可是题目的要求明显是 O ( n log ⁡ n ) O(n\log n) O(nlogn)及更优的复杂度.

考虑改变一下转化一下条件式子:
m x = max ⁡ i = l r { a i } , m n = min ⁡ i = l r { a i } m x − m n = r − l ⇔ m x − m n − r + l = 0 mx=\max_{i=l}^{r}\{a_i\},mn=\min_{i=l}^{r}\{a_i\}\\ mx-mn=r-l \Leftrightarrow mx-mn-r+l=0 mx=i=lmaxr​{ai​},mn=i=lminr​{ai​}mx−mn=r−l⇔mx−mn−r+l=0

考虑枚举右端点 r r r,然后维护每一个左端点 l l l对应的 m x − m n − r + l mx-mn-r+l mx−mn−r+l.

当 r r r变成 r + 1 r+1 r+1的时候,显然变化有三种:
1. r r r变成了 r + 1 r+1 r+1,也就是说要给左端点在 [ 1 , r − 1 ] [1,r-1] [1,r−1]的区间的值都 − 1 -1 −1.
2. m x mx mx会改变,且肯定是连续的一段区间 [ l ′ , r − 1 ] [l',r-1] [l′,r−1]的 m x mx mx改变.
3. m n mn mn会改变,同理是一段连续的区间 [ l ′ , r − 1 ] [l',r-1] [l′,r−1]改变.

以区间的左端点为下标建立线段树,就可以维护变化1了.

至于最值的变化,称一个极大的最值相同的子区间为一段,那么显然每次操作最多增加一个段,然后会将前面的一些段消除变成一段(与增加的段并成一段),容易发现这个时候被被操作的段的总数是线性的.

而显然,段的最大值必然是递减的,而每一段每次的变化量又是相同的(相当于可以直接区间加),所以可以用单调栈维护每一段,并用线段树维护变化量.

然后,答案就是每一次右端点变化时线段树中最小值的出现次数之和了(显然最小值必然为 0 0 0).

时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn).

具体实现的时候,不需要真的在栈中存储每个节点代表的区间和最值,只需要存储一个区间右端点就可以通过一些操作得到其它信息了.

代码如下:

#include<bits/stdc++.h>
  using namespace std;

#define Abigail inline void
typedef long long LL;

const int N=300000,INF=(1<<30)-1;

int n,a[N+9];
struct tree{
  int min,add,cnt;
}tr[N*4+9];

void Pushup(int k){
  int ls=k<<1,rs=k<<1|1;
  tr[k].min=min(tr[ls].min,tr[rs].min);
  tr[k].cnt=(tr[ls].min==tr[k].min?tr[ls].cnt:0)+(tr[rs].min==tr[k].min?tr[rs].cnt:0); 
}

void Update_add(int k,int v){tr[k].min+=v;tr[k].add+=v;}

void Pushdown(int k){
  if (!tr[k].add) return;
  Update_add(k<<1,tr[k].add);Update_add(k<<1|1,tr[k].add);
  tr[k].add=0;
}

void Build(int L,int R,int k){
  if (L==R) {tr[k].cnt=1;return;}
  int mid=L+R>>1;
  Build(L,mid,k<<1);Build(mid+1,R,k<<1|1);
  Pushup(k);
}

void Change_add(int L,int R,int v,int l,int r,int k){
  if (L>R) return;
  if (L==l&&R==r) {Update_add(k,v);return;}
  Pushdown(k);
  int mid=l+r>>1;
  if (R<=mid) Change_add(L,R,v,l,mid,k<<1);
  else if (L>mid) Change_add(L,R,v,mid+1,r,k<<1|1);
    else Change_add(L,mid,v,l,mid,k<<1),Change_add(mid+1,R,v,mid+1,r,k<<1|1);
  Pushup(k);
}

int Query_cnt(int L,int R,int l,int r,int k){
  if (L>R) return 0;
  if (L==l&&R==r) return tr[k].min==0?tr[k].cnt:0;
  Pushdown(k);
  int mid=l+r>>1;
  if (R<=mid) return Query_cnt(L,R,l,mid,k<<1);
  else if (L>mid) return Query_cnt(L,R,mid+1,r,k<<1|1);
    else return Query_cnt(L,mid,l,mid,k<<1)+Query_cnt(mid+1,R,mid+1,r,k<<1|1);
}

int mx[N+9],mn[N+9],cmx,cmn;
LL ans;

Abigail into(){
  scanf("%d",&n);
  int x;
  for (int i=1;i<=n;++i){
    scanf("%d",&x);
    scanf("%d",&a[x]);
  }
}

Abigail work(){
  Build(1,n,1);
  for (int i=1;i<=n;++i){
  	Change_add(1,i-1,-1,1,n,1);
	for (;cmx&&a[mx[cmx]]<=a[i];--cmx)
	  Change_add(mx[cmx-1]+1,mx[cmx],a[i]-a[mx[cmx]],1,n,1);
	mx[++cmx]=i;
	for (;cmn&&a[mn[cmn]]>=a[i];--cmn)
	  Change_add(mn[cmn-1]+1,mn[cmn],a[mn[cmn]]-a[i],1,n,1);
	mn[++cmn]=i;
	ans+=(LL)Query_cnt(1,i,1,n,1);
  }
}

Abigail outo(){
  printf("%lld\n",ans);
}

int main(){
  into();
  work();
  outo();
  return 0;
}
Unity技能系统架构设计:基于GAS框架实现数据驱动与模块化解耦 在游戏开发中,技能系统是角色扮演和动作类游戏的核心模块,其设计直接关系到游戏的可玩性和可维护性。传统技能实现常将逻辑硬编码在角色脚本中,导致代码耦合度高、难以扩展和维护。为解决这一问题,现代游戏开发引入了数据驱动和模块化设计思想,通过将技能逻辑分解为属性、标签、效果等独立组件,实现逻辑与数据的分离。Unity Gameplay Ability System (GAS) 正是基于这一理念的框架,它借鉴了虚幻引擎的设计,将技能拆分为条件检查、消耗冷却、效果应用等标准化流程,使策划能够通过配置组合出复杂技能,而程 阅读详情

相关推荐

usb gadget uvc driver的code分析

uvc的linux driver分为host侧和gadget侧两个driver。host侧的driver在v4l2框架下,而设备侧的driver在usb/gadget文件夹下。gadget侧的uvc driver,利用v4l2框架去注册video_device,向应用层提供调用接口。同时,它完成v4l2 video buffer拷贝到usb request下的buffer下,然后利用uvc实现的协

lintwins的专栏 1万+

[CF 526 F] Pudding Monsters(单调栈 + 线段树)

md,又是连续段计数问题,nm还是没做出来,给i奥!

620

什么是PCIe Relaxed Ordering

什么是PCIe上的Relaxed Ordering呢?直接翻译的话就是宽松排序。在理解这个东西之前,需要先了解下什么是PCIe的基本事务排序法则。

qq_42824983的博客 1509

CF526F Pudding Monsters

只会 n2做法 n2 做法就是简化题意后打个暴力... 首先化简题意,变成了要求一个序列中, 最大值 - 最小值 = 区间长度 - 1 的区间个数 数据范围很大,考虑分治,每层分治考虑过中点的答案 下面我就不会了= = 分以下几种情况: 1.max 在中点左边,min 也在中点左边 2.max 在中点右边,min 也在中点右边 3.max 在中点左边,min 在中点右...

weixin_30432007的博客 104

手把手教你用Kokoro-82M-v1.1-zh搭建本地TTS服务(含WebSocket接口)

本文详细介绍了如何使用Kokoro-82M-v1.1-zh模型搭建本地TTS服务,包括环境配置、模型部署、WebSocket接口实现及性能优化。通过实战指南,开发者可以快速掌握本地部署TTS系统的关键技术,提升语音交互应用的开发效率。

weixin_30776273的博客 183

【环境搭建】使用openSfM+MVSNet重建稠密点云

本帖详细介绍了如何使用openSfM+MVSNet对真实采集的数据进行稀疏重建与稠密重建,并针对一些真实场景下可能遇到的问题进行了整理。

YuhsiHu的博客 1971

cf 526 F

CF 526F 一个N × N的地图上有N个棋子,每一行每一列都有且仅有一个 棋子。问有多少个正方形满足其内部的棋子数等于其边长 SOLUTION: 可以发现按x坐标把点排序后得出一个排列,求有多少个区间长度等于最大值减最少值。可以考虑分治,可以算出中心到左右区间的最大最小值,若最大最小值在同侧则可以枚举一端算出另一端再判断是否合法。若不同侧可以发现左最大右最小时r-l==max...

weixin_30782293的博客 205

小程序结合Three.js与gsap:打造流畅3D动画的完整指南

本文详细介绍了如何在小程序中整合Three.js与GSAP动画库,打造流畅的3D动画效果。通过从环境搭建、基础场景创建到模型加载与复杂动画编排的完整指南,帮助开发者克服小程序性能限制,实现如商品360度展示等沉浸式交互体验,提升产品视觉吸引力。

python9snake的博客 546

【CF526F】Pudding Monsters cdq分治

【CF526F】Pudding Monsters 题意:给你一个排列$p_i$,问你有对少个区间的值域段是连续的。 $n\le 3\times 10^5$ 题解:bzoj3745 Norma 的弱化版。直接cdq分治,考虑最大值和最小值分别在左右两边的情况。这里就当练练手了。 #include <cstdio> #include <cstring> ...

aodanchui1057的博客 228

过压保护电路(OVP)

作者:AirCity 2020.2.4 Aircity007@sina.com 本文所有权归作者Aircity所有 1 示例一 当VBUS=5V时,各点电压电流如图所示,Q1接近截止,输出信号是5V。 当VBUS=5.4V开始,输出信号开始下降,直到VBUS=6.1V,输出信号降低为0.6V。 下面是实测波形,这个电路,输出信号的电压不会超过5.4V,这个输出信号可用于电源的控制信号。 2 ...

AirCity123的博客 3万+

北斗导航 | ChatGPT之RTK、RTD、ARAIM算法原理及程序代码(ChatGPT看你怎么回答,附部分代码)

ChatGPT之RTK、RTD、ARAIM算法原理及程序代码

尘世冰封的专栏 3677

【Codeforces 526F】Pudding Monsters | 线段树、单调栈

题目链接:https://codeforces.com/contest/526/problem/F 题目大意: 给出一个排列,查询满足R-L = Max - Min的区间[L,R]个数 题目思路: 考虑单调栈与线段树结合 维护以i结尾的合法的区间个数,所以可以将合法区间表示为: 所以: 所以就看一下z = 0的j有多少个 根据单调栈可以维护一下,每次最大值和最小值修改的区间 对于最小值修改: + 原有最小值 - 现在值 对于最大值修改: - 原有最大值 + 现在值 此时注意..

一只酷酷光儿的博客 436

【基于深度学习的脑电图识别】数据集篇:THE TUH EEG CORPUS: A Big Data Resource for Automated EEG Interpretation

【基于机器学习的脑电图识别】数据集篇:脑电信号自动判读的大数据摘要: 摘要: 这个数据集包括超过 25000 个脑电图研究,包括一个神经学家对测试的解释,一个简短的病人病史和关于病人的人口统计信息,如性别和年龄。这是第一次有足够的数据来支持最先进的机器学习算法的应用。在这篇论文中,我们使用了3762个语料库的会话子集,展示了从原始脑电图信号数据预测脑电图的一些基本属性的初步实验结果。在闭环测试中,...

梁瑛平的博客 5615

线段树-Pudding Monster CF526F-单调栈

Pudding Monster 题目连接:https://www.luogu.org/problem/show?pid=CF526F 问题提出 给长度为nnn的排列AAA. 问有多少(l,r)(l,r)(l,r),使得将Al,Al+1,...,ArA_l,A_{l+1},...,A_rAl​,Al+1​,...,Ar​排序之后是连续的一段数. n≤105n \le 10^5n≤105 问题解决...

SUNSET 702

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Codeforces 526F

怎么还有这么套路的题? 考虑按rir_iri​排序,问题就变为求出有多少个区间满足cic_ici​为连续段。这个问题有经典的线段树+单调栈做法。 具体来说,我们考虑对右端点rrr做扫描线,计算有多少个合法的左端点lll,那么合法条件是max⁡i=lrci−min⁡i=lrci=r−l\max_{i=l}^{r}c_i-\min_{i=l}^{r}c_i=r-lmaxi=lr​ci​−mini=lr...

mayaohua 803

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

CF526F Pudding Monsters 线段树+单调栈

刚开始想出了一个分治做法,但是比较麻烦,需要分 4 中情况讨论. 后来偷看了一眼标签发现是线段树,然后就想出了这个线段树做法. 考虑序列以 $r$ 为右端点的答案,有 $\sum_{l=1}^{i} max(l,i)-min(l,i)=i-l$. 其中这个条件可以写成 $max(l,i)-min(l,i)+l=i$. 然后特别注意任何时候都满足不等式:$r-l \...

EM LGH 225

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

CF526 F Pudding Monsters

题意 求连续段数。 n<=3e5 思路 析合树板题(然而并不会) 考虑分治求。 讨论max与min在左右两边的四种情况就行了。 O(nlogn)O(n log n)O(nlogn) #include <bits/stdc++.h> using namespace std; const int N = 3e5 + 10, Z = 3e5 * 2; typedef long lo...

一位蒟蒻的小博客 446

[51nod1555][CF526F]布丁怪

问题描述布丁怪这一款游戏是在一个n×n 的矩形网格中进行的,里面有n个网格有布丁怪,其它的一些格子有一些其它的游戏对象。游戏的过程中是要在网格中移动这些怪物。如果两个怪物碰到了一起,那么他们就会变成一个更大的怪物。(谁叫他们是布丁呢?) 据统计,如果每一行每一列都只有一个布丁怪,那么这样的布局是比较吸引玩家的。 所以为了产生多种多样的有趣布局,我们会从一个 n×n 的有趣的地图中选取一个k×k

ZLTJohn的博客 627

【IOI2020国家集训队作业 Part 1】CF526F Pudding Monsters

题目 题目描述 In this problem you will meet the simplified model of game Pudding Monsters. An important process in developing any game is creating levels. A game field in Pudding Monsters is an n×nn×n recta...

Brute♂force 598

【CF 526F】【奇袭】

题目大意给出一个n*n的图,有n个点,每行每列有且仅有一个点,求有多少个k*k矩形中有k个点。解题思路可以发现按x坐标把点排序后得出一个排列,求有多少个区间长度等于最大值减最少值。可以考虑分治,可以算出中心到左右区间的最大最小值,若最大最小值在同侧则可以枚举一端算出另一端再判断是否合法。若不同侧可以发现左最大右最小时r-l==max[l]-min[r],即l+max[l]==r+min[r],相互独

inklutcuah’s blog 704

Codeforces 526F Pudding Monsters

Problem Codeforces Solution 发现有些题目把情况分类讨论就可以使题目好处理很多。 注意到每行每列都只有一个怪物,那么我们可以将其转化到一维的情况,则可以得到一个排列,那么问题就变为了,统计有多少个子区间[L,R][L,R][L,R]满足mx−mn=R−Lmx-mn=R-Lmx−mn=R−L。好像很不好处理… 考虑跨越中点的区间,分类讨论一下mxmxmx和mnmnmn的分布...

Rayment的博客 605

codeforces 1132 G(线段树+单调栈)

题意: 规定一个子序列为递增的且每一位上的数的下一位恰好是原序列中该数下一个大于他的数。求长度为k的连续区间中最长的子序列的长度是多少 题解: 通过维护一个单调递减的栈来获得一个数后一位数的位置,之后我们可以把得出的这层关系连边形成一个森林方向为大数-&amp;gt;小数,并将所有入度为0的与一个须根(n+1)相连。 通过上述操作我们就可以发现,假如加上一个数的贡献,其贡献只会影响其子孙,删掉依然。于是我...

TelmaZzzz的博客 389

CodeForces 526F

查询行区间得到列的最大最小值 查询列区间得到行的最大最小值 。。。。 然后就不TLE了#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int N=3e5+100; typedef __int64 LL;int lg[N],mi[22]; void init(){ lg[0]

wen_xp的专栏 517

【Codeforces 526F】【JZOJ4687】奇袭

Description由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上要迎来最终的压力测试——魔界入侵。 唯一一个神一般存在的Administrator被消灭了,靠原本的整合骑士的力量是远远不够的。所以爱丽丝动员了UW全体人民,与整合骑士一起抗击魔族。 在UW的驻地可以隐约看见魔族军队的大本营。整合骑士们打算在魔族入侵前发动一次奇袭,袭击魔族大本营! 为了降低风

sadnohappy 1184

【Codeforces 526 F. Pudding Monsters】CDQ分治+乱搞

cf526F • n * n的矩形,每行每列有且仅有一个特殊点 • 求问存在多少k * k的子矩形,使得子矩形内有k个特殊点 • 1 ≤ n ≤ 3 * 1e5 • 二维前缀和 • 枚举即可 • O(n ^ 3) 肯定T • 转换为数列A,每个特殊点的横坐标为下标,纵坐标为权值 • Ax = y • 题目相当于询问存在多少(l, r)使得 • max(Al…Ar) - min(Al…Ar) == ...

我是谁 --- 卡比兽 256
上一篇: Codeforces 1181 D Irrigation 题解(树状数组+倍增)
下一篇: BZOJ1856【SCOI2010】字符串题解(组合数学+Catalan数)
hezlik
博客等级 码龄9年 111粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值