51Nod1962 区间计数
这题与之前那道区间最值的题非常类似,依旧是二分区间,然后统计跨过中间点的区间贡献。
我们要选出小于等于和小于的,这样就可以算出相等的区间长了。
复杂度O(nlogn)
By:大奕哥
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll ans;int n;
const int N=;
void add(ll x){ans+=x;}
int a[][N],p[][],l[][N],r[][N];
void solve(int ll,int rr)
{
if(ll==rr){if(a[][ll]==a[][ll])add();return;}
int mid=ll+rr>>;
solve(ll,mid);solve(mid+,rr);
for(int k=;k<=;++k)
{
l[k][mid]=a[k][mid];for(int i=mid-;i>=ll;--i)l[k][i]=max(l[k][i+],a[k][i]);
r[k][mid]=a[k][mid];for(int i=mid+;i<=rr;++i)r[k][i]=max(r[k][i-],a[k][i]);
}
for(int k=;k<=;++k)for(int i=;i<=;++i)p[k][i]=mid;
for(int i=mid;i>=ll;--i)
{
for(int k=;k<=;++k)
{
while(p[k][]<rr&&r[k][p[k][]+]<=l[k][i])p[k][]++;
while(p[k][]<rr&&r[k][p[k][]+]<l[k^][i])p[k][]++;
while(p[k][]<rr&&r[k][p[k][]+]<=l[k^][i])p[k][]++;
}
if(l[][i]==l[][i])add(max(,min(p[][],p[][])-mid));
else if(l[][i]>l[][i])add(max(,min(p[][],p[][])-p[][]));
else add(max(,min(p[][],p[][])-p[][]));
}
int pos=mid+;
for(int i=mid+;i<=rr;++i)
{
while(pos>ll&&max(l[][pos-],l[][pos-])<max(r[][i],r[][i]))--pos;
if(r[][i]==r[][i])add(max(,mid-pos+));
}
}
int main()
{
scanf("%d",&n);
for(int k=;k<=;++k)
for(int i=;i<=n;++i)
scanf("%d",&a[k][i]);
solve(,n);
printf("%lld\n",ans);
return ;
}
51Nod1962 区间计数的更多相关文章
- UVa 1640 The Counting Problem (数学,区间计数)
题意:给定两个数m, n,求从 m 到 n 中0-9数字各出现了多少次. 析:看起来挺简单的,其实并不好做,因为有容易想乱了.主要思路应该是这样的,分区间计数,先从个位进行计,一步一步的计算过来.都从 ...
- 51NOD 1962 区间计数 单调栈+二分 / 线段树+扫描线
区间计数 基准时间限制:1.5 秒 空间限制:262144 KB 分值: 80 两个数列 {An} , {Bn} ,请求出Ans, Ans定义如下: Ans:=Σni=1Σnj=i[max{ ...
- 51NOD 1810 连续区间 分治 区间计数
1810 连续区间 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 80 区间内所有元素排序后,任意相邻两个元素值差为1的区间称为“连续区间” 如:3,1,2是连续区间,但3, ...
- 类似区间计数的种类并查集两题--HDU 3038 & POJ 1733
1.POJ 1733 Parity game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5744 Accepted: ...
- 51nod 1962区间计数(单调栈加二分)
题目要求是求出两个序列中处于相同位置区间并且最大值相同的区间个数,我们最直观的感受就是求出每个区间的最大值,这个可以O(N)的求,利用单调栈求出每个数作为最大值能够覆盖的区间. 然后我们可以在进行单调 ...
- POJ 2155 Matrix【二维树状数组+YY(区间计数)】
题目链接:http://poj.org/problem?id=2155 Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissio ...
- POJ 2155 Matrix (树状数组 && 区间计数)
题意 : 给出一个N*N的矩阵, 矩阵只有可能包含0或1, 一开始则全部是0.对于矩阵可以进行两种操作, 第一种是输入 C x1 y1 x2 y2 表示, 对以(x1, y1)为左上角, 以(x2, ...
- 【做题记录】max-min+1=len 区间计数
(来源:XJ高质量原创题) 原题地址 弱化版:CF526F Pudding Monsters 弱化版 题意:\(n\times n\) 的棋盘上有 \(n\) 颗棋子,每行每列都有且仅有一颗棋子,求出 ...
- 51nod 1962 区间计数(单调栈+二分)
维护两个单调递减的栈,当i加进栈,位置x的数弹出的时候,在另一个栈中找到和这个数一样大的数,计算贡献(x-靠右左端点)*(i-x). #include<iostream> #include ...
随机推荐
- laravel判断是否post传输
可以用post传输判断form表单是否有值post传过来: if($request->isMethod('post')){ // 要执行的代码 }通过 Request 对象的 isMethod ...
- Metasploit 使用基础
本文将简单介绍一下Kali2 上Metasploit的一些基本使用,包括启动.更新及一个小问题"Module database cache not built yet, using slow ...
- 21、利用selenium进行Web测试
一.案例实施步骤思路分析 1.寻包 2.指定浏览器(实例化浏览器对象) 3.打开项目 4.找到元素(定位元素) 5.操作元素 6.暂停 7.关闭二.元素定位[重点] 1.id 说明:通过元素的id属性 ...
- 项目开发 -- ZFS容量分配
存储池 allocated 池中已实际分配的存储空间量.该属性也可通过其简短列名alloc来引用. capacity 已用的池空间百分比.此属性也可通过其简短列名cap来引用. dedupratio ...
- Mysql储存过程1: 设置结束符与储存过程创建
#显示储存过程 show procedure status; #设置结束符 delimiter $; #创建储存过程 create procedure procedure_name() begin - ...
- 【swupdate文档 四】SWUpdate:使用默认解析器的语法和标记
SWUpdate:使用默认解析器的语法和标记 介绍 SWUpdate使用库"libconfig"作为镜像描述的默认解析器. 但是,可以扩展SWUpdate并添加一个自己的解析器, ...
- Deep Learning基础--随时间反向传播 (BackPropagation Through Time,BPTT)推导
1. 随时间反向传播BPTT(BackPropagation Through Time, BPTT) RNN(循环神经网络)是一种具有长时记忆能力的神经网络模型,被广泛用于序列标注问题.一个典型的RN ...
- Deploy Openstack with RDO and Change VNC console to Spice
Deploy Openstack with RDO and Change VNC console to Spice host os: centOS 7 server config network an ...
- Python 根据地址获取经纬度及求距离
方法一: 使用Geopy包 : https://github.com/geopy/geopy (仅能精确到城镇,具体街道无结果返回) from geopy.geocoders import Nom ...
- xshell 映射带跳板机服务器的端口到本地
1.配置xshell连接跳板机服务器: 2. 3.可用navicate等同过端口连接远程数据库.