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 ...
随机推荐
- 说一说ASP.NET web.config 加密及解密方法 (代码)
/// <summary> /// 保护web.config的加密和解密 /// </summary> public class ProtectHelper { /// < ...
- 【leetcode 简单】第十一题 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5 输 ...
- vc 播放音乐
#include <vfw.h> #pragma comment(lib,"vfw32.lib") ● 简单实现 要实现一个播放器,首先要先建立一个MF ...
- c语言学习笔记.条件编译.#if,#ifdef,if的区别
最近遇到了,以此做个记录. 条件编译 是C预处理部分的内容. 其判断语句包括 #if #else if #else 以及 #ifdef 和 #endif. 使用 #if (表达式) codes1. ...
- win10-idea2018
下载jar JetbrainsCrack-2.9-release-enc.jar idea64.exe.vmpotions 配置 -javaagent:D:\devsoft\idea\bin\Jetb ...
- 在rhel7上搭建centos7的yum源
1. 再查看现在主机上的yum源,并将它们删除 [root@localhost ~]# rpm -qa|grep yum | xargs rpm -e --nodeps # --nodeps 不管有没 ...
- 自己实现的SVM源码
首先是DATA类 import java.awt.print.Printable; import java.io.File; import java.io.FileNotFoundException; ...
- hosts,命令行前面的显示
1,/etc/hosts,主机名ip配置文件. # Do not remove the following line, or various programs # that require netwo ...
- Effective C++笔记(二):构造/析构/赋值运算
参考:http://www.cnblogs.com/ronny/p/3740926.html 条款05:了解C++默默编写并调用哪些函数 如果自定义一个空类的话,会自动生成默认构造函数.拷贝构造函数. ...
- NVIDIA DIGITS 学习笔记(NVIDIA DIGITS-2.0 + Ubuntu 14.04 + CUDA 7.0 + cuDNN 7.0 + Caffe 0.13.0)
转自:http://blog.csdn.net/enjoyyl/article/details/47397505?from=timeline&isappinstalled=0#10006-we ...