「CF526F」 Pudding Monsters
CF526F Pudding Monsters
模型转换:对于一个 \(n\times n\) 的棋盘,若每行每列仅有一个棋子,令 \(a_x=y\),则 \(a\) 为一个排列。
转换成排列过后问题即变为:给定一个排列,求有多少个区间满足 \(\max-\min=r-l\)。
然后我突然发现原来模拟赛好像考过这玩意。好像是用单调栈加线段树维护。
然后我发现我完全不懂(看来是当时对着题解抄的)
事实上枚举右端点维护 \(\max-\min-\operatorname{len}\) 即可。
其中最大最小值用单调栈维护变化量。
然后把这玩意弄懂了就很简单了。
贴代码
/*---Author:HenryHuang---*/
/*---Never Settle---*/
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+5;
int val[maxn];
int num[maxn<<2],tot[maxn<<2],tag[maxn<<2];
void up(int t){
num[t]=min(num[t<<1],num[t<<1|1]);tot[t]=0;
if(num[t]==num[t<<1]) tot[t]+=tot[t<<1];
if(num[t]==num[t<<1|1]) tot[t]+=tot[t<<1|1];
return ;
}
void down(int t){
if(tag[t]){
num[t<<1]+=tag[t],num[t<<1|1]+=tag[t];
tag[t<<1]+=tag[t],tag[t<<1|1]+=tag[t];
tag[t]=0;
}
}
void build(int l,int r,int t){
if(l==r){
num[t]=tot[t]=1;
return ;
}
int mid=(l+r)>>1;
build(l,mid,t<<1);
build(mid+1,r,t<<1|1);
up(t);return ;
}
void update(int ll,int rr,int l,int r,int nu,int t){
if(ll<=l&&r<=rr){
tag[t]+=nu;
num[t]+=nu;
return ;
}
int mid=(l+r)>>1;down(t);
if(ll<=mid) update(ll,rr,l,mid,nu,t<<1);
if(rr>mid) update(ll,rr,mid+1,r,nu,t<<1|1);
up(t);return ;
}
int query(int ll,int rr,int l,int r,int t){
if(ll<=l&&r<=rr){
if(num[t]==0) return tot[t];
return 0;
}
int mid=(l+r)>>1;down(t);int tmp=0;
if(ll<=mid) tmp+=query(ll,rr,l,mid,t<<1);
if(rr>mid) tmp+=query(ll,rr,mid+1,r,t<<1|1);
return tmp;
}
stack<pair<int,int> > mn,mx;
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n;cin>>n;
for(int i=1;i<=n;++i){
int a,b;cin>>a>>b;
val[a]=b;
}
mx.emplace(0,2e9),mn.emplace(0,0);
build(1,n,1);
long long ans=0;
for(int i=1;i<=n;++i){
int p,q;
while((!mx.empty())&&mx.top().second<=val[i]){
tie(p,q)=mx.top();mx.pop();
update(mx.top().first+1,p,1,n,val[i]-q,1);
}
mx.emplace(i,val[i]);
while((!mn.empty())&&mn.top().second>=val[i]){
tie(p,q)=mn.top();mn.pop();
update(mn.top().first+1,p,1,n,q-val[i],1);
}
mn.emplace(i,val[i]);
update(1,i,1,n,-1,1);
ans=(ans+query(1,i,1,n,1));
}
cout<<ans<<'\n';
return 0;
}
「CF526F」 Pudding Monsters的更多相关文章
- 【CF526F】Pudding Monsters cdq分治
[CF526F]Pudding Monsters 题意:给你一个排列$p_i$,问你有对少个区间的值域段是连续的. $n\le 3\times 10^5$ 题解:bzoj3745 Norma 的弱化版 ...
- 【CF526F】Pudding Monsters
题意: 给你一个排列pi,问你有对少个区间的值域段是连续的. n≤3e5 题解: bzoj3745
- CF526F Pudding Monsters
CF526F Pudding Monsters 题目大意:给出一个\(n* n\)的棋盘,其中有\(n\)个格子包含棋子. 每行每列恰有一个棋子. 求\(k*k\)的恰好包含\(k\)枚棋子的子矩形个 ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
随机推荐
- JVM-垃圾收集算法基础
目录 目录 前言 手动释放内存导致的问题 垃圾判定方法 哪些对象是垃圾? 引用计数算法 可达性分析法 垃圾收集算法 标记-清除 优点 缺点 优化 标记-复制 优点 缺点 优化 标记-整理 优点 缺点 ...
- GO学习-(17) Go语言基础之反射
Go语言基础之反射 本文介绍了Go语言反射的意义和基本使用. 变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息. 值信息:程序运行过程中可动态变化的. 反射介绍 反射是指 ...
- celery异步任务体系笔记
1.异步框架示意图 2.celery 官方文档 http://docs.celeryproject.org/en/latest/index.html 3.启动celery的命令 启动 sender 自 ...
- Docker学习(9) Docker守护进程的配置和操作
- Jmeter- 笔记7 - 服务器监控(ServerAgent配置)
文件:ServerAgent - 2.2.3.zip 放网盘了 在服务器的操作:只需要把这个文件上传到被监控服务器,然后解压,启动sh startagent.sh --udp-port 0 --tc ...
- Python分析离散心率信号(上)
Python分析离散心率信号(上) 一些理论和背景 心率包含许多有关信息.如果拥有心率传感器和一些数据,那么当然可以购买分析包或尝试一些可用的开源产品,但是并非所有产品都可以满足需求.也是这种情况.那 ...
- ASIC设计-终极指南
ASIC设计-终极指南 ASIC Design – The Ultimate Guide ASIC设计-终极指南 ASICs代表特定于应用的集成电路,指的是针对特定应用而设计的半导体解决方案,与其他解 ...
- 打造住院新体验,GVS智慧病房有何独到之处?
3月26-28日,由广东省医院协会主办的"2021第二届广东省医院建设大会暨医院建筑与装备展览会"在广州琶洲国际采购中心盛大举办,来自全国各地的医院代表及企事业单位代表4000余人 ...
- python_selenium 之logging模块入门及调用实战
一.logging模块是什么? 是Python内置的标准模块,主要用于输出运行日志 二.日志的作用 日志是代码的必要组成部分 记录日志能显示程序当前运行状态 出问题后定位当时问题 三.python日志 ...
- LeetCode:322. 零钱兑换
链接:https://leetcode-cn.com/problems/coin-change/ 标签:动态规划.完全背包问题.广度优先搜索 题目 给定不同面额的硬币 coins 和一个总金额 amo ...