「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),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
随机推荐
- node.js学习(5)读写文件(同步异步)
1 导入文件系统库 # 同步的 读文件 写文件 # 异步 需要用异步处理耗时
- MinkowskiEngine Miscellaneous Classes杂类
Miscellaneous Classes杂类 内核生成器 class MinkowskiEngine.KernelGenerator(kernel_size = -1,stride = 1,dila ...
- 利用NVIDIA NGC的TensorRT容器优化和加速人工智能推理
利用NVIDIA NGC的TensorRT容器优化和加速人工智能推理 Optimizing and Accelerating AI Inference with the TensorRT Contai ...
- VB 老旧版本维护系列---读取xml某个节点的值
读取xml某个节点的值 '定义xml字符串内容地址 Dim xmlFileStr As String = "" '定义所需读取节点的名称 Dim readNodeName As S ...
- C++中头文件和实现文件的关系
头文件相当于是声明的集合,包括头文件的语句#Include实质为程序代码的宏替换. 编译阶段将函数和变量登记在符号表,链接时将各种函数的入口地址在其中查找到来调用,解引用.
- ES6函数参数
之前在看Vue2.0的时候,就被很多的箭头函数困扰,一直不知道是怎么回事,虽然箭头函数四个字在我耳边一直转圈,今天小编整理整理箭头函数里面的常见用法和表现形式,在这个Vue3.0已经到来的一段时间,希 ...
- QByteArray使用方法大全
QByteArray 在Qt中QByteArray可以看做是c语言中 char*的升级版本.我们在使用这种类型的时候可通过这个类的构造函数申请一块动态内存,用于存储我们需要处理的字符串数据. 下面给大 ...
- 【Java编程实战】Metasploit_Java后门运行原理分析以及实现源码级免杀与JRE精简化
QQ:3496925334 文章作者:MG1937 CNBLOG博客ID:ALDYS4 未经许可,禁止转载 某日午睡,迷迷糊糊梦到Metasploit里有个Java平台的远控载荷,梦醒后,打开虚拟机, ...
- 11张流程图搞定 Spring Bean 生命周期
在网上已经有跟多Bean的生命周期的博客,但是很多都是基于比较老的版本了,最近把整个流程化成了一个流程图.待会儿使用流程图,说明以及代码的形式来说明整个声明周期的流程.注意因为代码比较多,这里的流程图 ...
- 最佳实践丨使用Rancher轻松管理上万资源不是梦!
前 言 Rancher 作为一个开源的企业级 Kubernetes 集群管理平台.你可以导入现有集群,如 ACK.TKE.EKS.GKE,或者使用 RKE.RKE2.K3s 自定义部署集群. 作为业界 ...