1810 连续区间
基准时间限制:1.5 秒 空间限制:131072 KB 分值: 80
 
 
区间内所有元素排序后,任意相邻两个元素值差为1的区间称为“连续区间”

如:3,1,2是连续区间,但3,1,4不是连续区间
给出一个1~n的排列,求出有多少个连续区间
Input
一个数n(n<=1,000,000)
第二行n个数,表示一个1~n的排列
Output
一个数,表示有多少个连续区间
Input示例
5
2 1 5 3 4
Output示例
9
样例解释:
区间[1,1][2,2][3,3][4,4][5,5][1,2][4,5][3,4][1,5]为连续区间//[l,r]表示从第l个数到第r个数构成的区间
 
题解:
  分治计数
  先将序列划分为左右两边,只考虑左端点在左边部分,右端点在右边部分的答案
  也就是左边部分对右边部分答案的贡献
  可知
      Max{max(i),max(j)} - Min{min(i),min(j)} = j - i;
  共有4中互不影响的情况,其实这里分类讨论下就可以O(1)求出
#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 连续区间 分治 区间计数的更多相关文章

  1. 51Nod 1810 连续区间

    https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1810 题目给出一个1~n的排列,问有多少连续区间.连续区间的定义为区间 ...

  2. 51NOD 1962 区间计数 单调栈+二分 / 线段树+扫描线

     区间计数   基准时间限制:1.5 秒 空间限制:262144 KB 分值: 80   两个数列 {An} , {Bn} ,请求出Ans, Ans定义如下: Ans:=Σni=1Σnj=i[max{ ...

  3. UVa 1640 The Counting Problem (数学,区间计数)

    题意:给定两个数m, n,求从 m 到 n 中0-9数字各出现了多少次. 析:看起来挺简单的,其实并不好做,因为有容易想乱了.主要思路应该是这样的,分区间计数,先从个位进行计,一步一步的计算过来.都从 ...

  4. 51nod 1962区间计数(单调栈加二分)

    题目要求是求出两个序列中处于相同位置区间并且最大值相同的区间个数,我们最直观的感受就是求出每个区间的最大值,这个可以O(N)的求,利用单调栈求出每个数作为最大值能够覆盖的区间. 然后我们可以在进行单调 ...

  5. 51nod 1962 区间计数(单调栈+二分)

    维护两个单调递减的栈,当i加进栈,位置x的数弹出的时候,在另一个栈中找到和这个数一样大的数,计算贡献(x-靠右左端点)*(i-x). #include<iostream> #include ...

  6. 51nod 1021 石子归并 - 区间dp(经典)

    题目地址:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1021 经典区间dp,dp[i][j] 表示将从 i 到 j 堆 ...

  7. 51Nod 1522 上下序列 —— 区间DP

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1522 区间DP,从大往小加: 新加入一种数有3种加法:全加左边,全 ...

  8. 类似区间计数的种类并查集两题--HDU 3038 & POJ 1733

    1.POJ 1733 Parity game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5744   Accepted: ...

  9. 51nod 第K大区间2(二分+树状数组)

    题目链接: 第K大区间2 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为 ...

随机推荐

  1. hdu 4300 kmp算法扩展

    Clairewd’s message Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  2. 洛谷P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers

    题目描述 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少.在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人.然而,在任何一群朋友中 ...

  3. Linux Malloc分析-从用户空间到内核空间【转】

    转自:http://blog.csdn.net/ordeder/article/details/41654509 版权声明:本文为博主(http://blog.csdn.net/ordeder)原创文 ...

  4. kd树的构造与搜索

    学习了两篇博客,存下来以免丢失. http://blog.csdn.net/losteng/article/details/50893739 https://leileiluoluo.com/post ...

  5. 树(弱化版)(lca)

    3306: 树 时间限制: 10 Sec  内存限制: 256 MB 题目描述 给定一棵大小为 n 的有根点权树,支持以下操作:  • 换根  • 修改点权      • 查询子树最小值 输入 第一行 ...

  6. 同源策略Same-origin policy

     同源策略Same-origin policy 同源策略Same-origin policy是Web应用的一种安全基础策略.它规定同一源中,页面包含的脚本可以访问该源下的其他页面的数据.只有当网址中的 ...

  7. AC自动机(加强版)

    题目描述 有NN个由小写字母组成的模式串以及一个文本串TT.每个模式串可能会在文本串中出现多次.你需要找出哪些模式串在文本串TT中出现的次数最多. 输入输出格式 输入格式: 输入含多组数据. 每组数据 ...

  8. C# 根据生日获取年龄

    C# 根据生日获取年龄 根据生日计算出准确的年龄,不等于0时,返回的是岁,等于0时,返回的是天(以‘-’来区分) public static string GetAgeByBirth(string B ...

  9. rocketMQ--搭建demo的坑

    果然不出所料,搭建起来就有坑 ,客户端经典的connection 11911的错误 在我的环境上解决方法加一行配置 brokerClusterName = DefaultClusterbrokerNa ...

  10. Delphi Helper Record Class

    unit Unit1; {$DEFINE USESGUIDHELP} interface implementation {$IFDEF USESGUIDHELP} uses System.SysUti ...