【51Nod1810】连续区间
来源:互联网 发布:淘宝虚假交易新规 编辑:程序博客网 时间:2024/05/17 01:30
区间内所有元素排序后,任意相邻两个元素值差为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个数构成的区间
题解
http://blog.csdn.net/f_zyj/article/details/76359956
代码
#include<bits/stdc++.h>#define mod 998244353#define inv 499122177#define N 1000005typedef __float128 F;typedef long long ll;using namespace std;inline int read(){ int x=0;char ch=getchar(); while (ch<'0'||ch>'9') ch=getchar(); while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x;}int n,mx[N],mn[N],a[N],D[N<<2],ans;void solve(int l,int r){ if (l==r){ans++;return;} int mid=(l+r)>>1; mx[mid]=mn[mid]=a[mid];mx[mid+1]=mn[mid+1]=a[mid+1]; for (int i=mid-1;i>=l;i--) mx[i]=max(a[i],mx[i+1]),mn[i]=min(a[i],mn[i+1]); for (int i=mid+2;i<=r;i++) mx[i]=max(a[i],mx[i-1]),mn[i]=min(a[i],mn[i-1]); for (int i=mid;i>=l;i--) { int j=i+mx[i]-mn[i]; if (j>mid&&j<=r&&mx[i]>mx[j]&&mn[i]<mn[j]) ans++; } for (int j=mid+1;j<=r;j++) { int i=j-mx[j]+mn[j]; if (i<=mid&&i>=l&&mx[j]>mx[i]&&mn[j]<mn[i]) ans++; } int L=mid+1,R=mid; for (int i=mid;i>=l;i--) { while (R<r&&mx[R+1]<mx[i]) { R++; D[mn[R]+R+N]++; } while (L<=R&&mn[L]>mn[i]) { D[mn[L]+L+N]--; L++; } ans+=D[mx[i]+i+N]; } while (L<=R) D[mn[L]+L+N]--,L++; L=mid+1;R=mid; for (int j=mid+1;j<=r;j++) { while (L>l&&mx[L-1]<mx[j]) { L--; D[mn[L]-L+N]++; } while (R>=L&&mn[R]>mn[j]) { D[mn[R]-R+N]--; R--; } ans+=D[mx[j]-j+N]; } while (R>=L) D[mn[R]-R+N]--,R--; solve(l,mid);solve(mid+1,r);}int main(){ n=read(); for (int i=1;i<=n;i++) a[i]=read(); solve(1,n); printf("%d",ans); return 0;}
阅读全文
0 0
- [51nod1810]连续区间
- 【51Nod1810】连续区间
- 51Nod-1810-连续区间
- 51nod 1810 连续区间
- 51nod 1810 连续区间(分治)
- 连续区间最大值
- 蓝桥杯连续区间数
- 区间连续极值
- 效验连续区间
- 51nod 1393 0和1相等串 (连续区间)
- 51nod 1094 和为k的连续区间
- 51nod 1094 和为k的连续区间
- 51nod 1094 和为k的连续区间
- 51nod-1094 和为k的连续区间
- 51nod 1094 和为k的连续区间
- 51nod-【1094 和为k的连续区间】
- 51Nod 1094 和为k的连续区间
- 51nod 1094 和为k的连续区间
- ARKit-带你走进全新的世界(四:平面检测)
- offer4
- Mongodb带权限控制的安装服务并新建个管理账户和一般数据库用户
- MVC模式简介
- 初识Java多线程
- 【51Nod1810】连续区间
- Android屏蔽ListView部分Item点击事件
- ZOJ 3203 Light Bulb
- 日报的意义
- leetcode494 TargetSum 非动态规划的解法
- 超实用!必须收藏的101条万能微信标题公式
- 第十章 基本数据结构
- Eagle 分布式rpc调用
- 动态规划-416. Partition Equal Subset Sum