51NOD 1810 连续区间 分治 区间计数
一个数n(n<=1,000,000)
第二行n个数,表示一个1~n的排列
一个数,表示有多少个连续区间
5
2 1 5 3 4
9
样例解释:
区间[1,1][2,2][3,3][4,4][5,5][1,2][4,5][3,4][1,5]为连续区间//[l,r]表示从第l个数到第r个数构成的区间
#include <bits/stdc++.h>
inline long long read(){long long x=,f=;char ch=getchar();while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}return x*f;}
using namespace std;
#define ls i<<1
#define rs ls | 1
#define mid ((ll+rr)>>1)
#define MP make_pair
typedef long long LL;
typedef unsigned long long ULL;
const long long INF = 1e18+1LL;
const double pi = acos(-1.0);
const int N = 1e6 + , M = , inf = 1e9; LL ans,mx[N],mx1[N],mn[N],mn1[N],vis[N * ];
int a[N],n; void solve(int ll,int rr) {
if(ll == rr) return ;
int last1 = -,last2 = inf;
for(int i = mid; i >= ll; --i)
mx[i] = max(last1,a[i]),last1 = mx[i],
mn[i] = min(last2,a[i]),last2 = mn[i];
last1 = -,last2 = inf;
for(int i = mid+; i <= rr; ++i)
mx1[i] = max(last1,a[i]),last1 = mx1[i],
mn1[i] = min(last2,a[i]),last2 = mn1[i]; for(int i = ll; i <= mid; ++i) {
int tmp = i + mx[i] - mn[i];
if(tmp > mid && tmp <= rr
&& mx[i] > mx1[tmp] && mn[i] < mn1[tmp]) ans+=;
} for(int i = mid+; i <= rr; ++i) {
int tmp = i - mx1[i] + mn1[i];
if(tmp >= ll && tmp <= mid
&& mx1[i] > mx[tmp] && mn1[i] < mn[tmp]) ans+=;
}
int l = mid+,r = mid;
for(int i = mid; i >= ll; --i) {
while(r < rr && mx[i] > mx1[r+]) ++r, vis[r+mn1[r]+n]++;
while(l <= r && mn[i] < mn1[l]) vis[l+mn1[l]+n]--,++l;
ans += vis[i+mx[i]+n];
}
while(l <= r) vis[l+mn1[l]+n]--,l++; l = mid, r = mid+;
for(int i = mid+; i <= rr; ++i) {
while(r > ll && mx1[i] > mx[r-]) r--,vis[r-mn[r]+n]++;
while(l >= r && mn[l] > mn1[i]) vis[l-mn[l]+n]--,l--;
ans += vis[i-mx1[i]+n];
}
while(l >= r) vis[l-mn[l]+n]--,l--;
solve(ll,mid),solve(mid+,rr);
}
int main() {
scanf("%d",&n);
for(int i = ; i <= n; ++i) a[i] = read();
solve(,n);
printf("%lld\n",ans+n);
return ;
}
51NOD 1810 连续区间 分治 区间计数的更多相关文章
- 51Nod 1810 连续区间
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1810 题目给出一个1~n的排列,问有多少连续区间.连续区间的定义为区间 ...
- 51NOD 1962 区间计数 单调栈+二分 / 线段树+扫描线
区间计数 基准时间限制:1.5 秒 空间限制:262144 KB 分值: 80 两个数列 {An} , {Bn} ,请求出Ans, Ans定义如下: Ans:=Σni=1Σnj=i[max{ ...
- UVa 1640 The Counting Problem (数学,区间计数)
题意:给定两个数m, n,求从 m 到 n 中0-9数字各出现了多少次. 析:看起来挺简单的,其实并不好做,因为有容易想乱了.主要思路应该是这样的,分区间计数,先从个位进行计,一步一步的计算过来.都从 ...
- 51nod 1962区间计数(单调栈加二分)
题目要求是求出两个序列中处于相同位置区间并且最大值相同的区间个数,我们最直观的感受就是求出每个区间的最大值,这个可以O(N)的求,利用单调栈求出每个数作为最大值能够覆盖的区间. 然后我们可以在进行单调 ...
- 51nod 1962 区间计数(单调栈+二分)
维护两个单调递减的栈,当i加进栈,位置x的数弹出的时候,在另一个栈中找到和这个数一样大的数,计算贡献(x-靠右左端点)*(i-x). #include<iostream> #include ...
- 51nod 1021 石子归并 - 区间dp(经典)
题目地址:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1021 经典区间dp,dp[i][j] 表示将从 i 到 j 堆 ...
- 51Nod 1522 上下序列 —— 区间DP
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1522 区间DP,从大往小加: 新加入一种数有3种加法:全加左边,全 ...
- 类似区间计数的种类并查集两题--HDU 3038 & POJ 1733
1.POJ 1733 Parity game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5744 Accepted: ...
- 51nod 第K大区间2(二分+树状数组)
题目链接: 第K大区间2 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为 ...
随机推荐
- 洛谷P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers
题目描述 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少.在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人.然而,在任何一群朋友中 ...
- jquery插件的基本写法
(function($){ var a={name:'2222',age:5555} var b={sex:'男',grade:5555} var c=$.extend({},a,b);//合并到新的 ...
- fuelgauge
void fg_init(void *queue, void (*bs_fuel_gauge_status)(void)) { fg_init_ready = bs_fuel_gauge_status ...
- PHP解码Json(json_decode)字符串返回NULL的原因及解决方法(转载)
本文主要为大家讲解了php在使用json_decode函数解码json字符串时,解码不成功返回NULL的问题原因分析和解决方法,感兴趣的同学参考下. 一般来说,php对json字符串解码使用json_ ...
- 浅谈MVP设计模式
最近公司在做一个医疗项目,使用WinForm界面作为客户端交互界面.在整个客户端解决方案中.使用了MVP模式实现.由于之前没有接触过该设计模式,所以在项目完成到某个阶段时,将使用MVP的体会写在博客里 ...
- https的简单学习
HTTPS介绍: (全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Sec ...
- 将xml转换为PHP数组
这里提供一个类来将XML转换为PHP数组,下面是类的代码 <?php/** * XML2Array: A class to convert XML to array in PHP * It re ...
- Linux Root下的.gvfs出现异常解决办法(导致source失败,自启动失败)
原文地址: http://www.cnblogs.com/tdyizhen1314/p/4142991.html 在linux系统下安装软件或复制文件的时候,复制不成功,出现错误如下: error ...
- unigui控件的FASTSCRIPT封装
unigui控件的FASTSCRIPT封装 unit fs_uniControl; interface{$i fs.inc}uses fs_iinterpreter, fs_itools, fs_ie ...
- android -- 存储byte
public static String byteArrayToHexStr(byte[] byteArray) { if (byteArray == null){ return null; } ch ...