转化一下询问即为区间$max - min + 1 = cnt$,其中$cnt$表示区间内数的种类数。

即求有多少区间$max - min - cnt=-1$,注意到任意区间的$max-min-cnt \geq -1$,那么即维护区间$max-min-cnt$的最小值和最小值的个数,再看最小值等不等于$-1$就行了。

那么可以用扫描线扫右端点$r$,线段树维护左端点为$1, 2,\dots,r-1$的区间最小值和最小值的个数。每加入一个数,$r$这里必定为$-1$,所以当前区间最小值的个数就是答案了。

对于区间种类数就$[last[a[i]], i - 1]$多了$1$,那么要减去$1$,因为在式子里$cnt$,前面是负号。

然后最大值最小值就用两个单调栈搞一下就好了。区间加上对应的差值即可。

#include <bits/stdc++.h>
#define ll long long
using namespace std; const int N = 1e5 + ;
int top1, top2, a[N], st1[N], st2[N];
map<int, int> pos; struct Seg {
#define lp p << 1
#define rp p << 1 | 1
int tree[N << ], lazy[N << ], sum[N << ];
inline void init() {
memset(tree, , sizeof(tree));
memset(lazy, , sizeof(lazy));
memset(sum, 0x3f, sizeof(sum));
}
inline void pushdown(int p) {
if (lazy[p] == ) return;
lazy[lp] += lazy[p];
lazy[rp] += lazy[p];
sum[lp] += lazy[p];
sum[rp] += lazy[p];
lazy[p] = ;
}
inline void pushup(int p) {
sum[p] = min(sum[lp], sum[rp]);
if (sum[lp] == sum[rp]) tree[p] = tree[lp] + tree[rp];
else if (sum[lp] < sum[rp]) tree[p] = tree[lp];
else tree[p] = tree[rp];
}
void update(int p, int l, int r, int pos) {
if (l == r) {
tree[p] = ;
sum[p] = -;
return;
}
pushdown(p);
int mid = l + r >> ;
if (pos <= mid) update(lp, l, mid, pos);
else update(rp, mid + , r, pos);
pushup(p);
}
void update(int p, int l, int r, int x, int y, int val) {
if (x > y) return;
if (x <= l && y >= r) {
sum[p] += val;
lazy[p] += val;
return;
}
pushdown(p);
int mid = l + r >> ;
if (x <= mid) update(lp, l, mid, x, y, val);
if (y > mid) update(rp, mid + , r, x, y, val);
pushup(p);
}
} seg; inline void init() {
top1 = top2 = ;
seg.init();
pos.clear();
} int main() {
int T;
int kase = ;
scanf("%d", &T);
while (T--) {
init();
ll ans = ;
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++) {
seg.update(, , n, i);
scanf("%d", &a[i]);
while (top1 && a[st1[top1]] <= a[i]) {
int p = st1[top1], key = a[st1[top1]];
top1--;
seg.update(, , n, st1[top1] + , p, a[i] - key);
}
st1[++top1] = i;
while (top2 && a[st2[top2]] >= a[i]) {
int p = st2[top2], key = a[st2[top2]];
top2--;
seg.update(, , n, st2[top2] + , p, key - a[i]);
}
st2[++top2] = i;
int l = pos[a[i]];
seg.update(, , n, l + , i - , -);
pos[a[i]] = i;
ans += seg.tree[];
}
printf("Case #%d: %lld\n", ++kase, ans);
}
return ;
}

2018宁夏邀请赛 L. Continuous Intervals的更多相关文章

  1. 2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树)

    2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树) 传送门:https://nanti.jisuanke.com/t/41296 题意: 给一个数列A 问在数列A中有多 ...

  2. 2018宁夏邀请赛L Continuous Intervals

    题目链接:https://nanti.jisuanke.com/t/28412 题意: 给出n个数的序列.问序列中有多少个区间满足,排序完之后任意两个相邻的数之差不大于1. 题解: 用max表示区间最 ...

  3. “2018宁夏邀请赛 ” 兼 “The 2019 Asia Yinchuan First Round Online Programming”

    ------------7题弟弟,被各位半小时13题的大佬打惨了(滑稽)---------- 签到题就不写了. F :Moving On            (1247ms) 题意:给定大小为N的带 ...

  4. 2018宁夏邀请赛 Continuous Intervals(单调栈 线段树

    https://vjudge.net/problem/Gym-102222L 题意:给你n个数的序列,让判断有几个区间满足排完序后相邻两数差都不大于1. 题解:对于一个区间 [L,R],记最大值为 m ...

  5. 2018宁夏邀请赛网赛 I. Reversion Count(java练习题)

    题目链接 :https://nanti.jisuanke.com/t/26217 Description: There is a positive integer X, X's reversion c ...

  6. 2018宁夏邀请赛K Vertex Covers

    题目链接:https://nanti.jisuanke.com/t/28411 题意: 给出n(n<=36)个点的一个图.求点覆盖集数. 题解: 将n个点折半为L和R两部分.对于R内部的边,枚举 ...

  7. 2018宁夏邀请赛G(DFS,动态规划【VECTOR<PAIR>】)

    //代码跑的很慢四秒会超时,结尾附两秒代码(标程) #include<bits/stdc++.h>using namespace std;typedef long long ll;cons ...

  8. 2018宁夏邀请赛K题Vertex Covers(高维前缀和 状压 折半

    https://vjudge.net/problem/Gym-102222K 题意:给定N点M边的无向图,每个点有点权.  点覆盖表示某个点集S{}覆盖了所有的边,其贡献是S中点权之积. 现在让你求所 ...

  9. 2018ICPC银川 L Continuous Intervals 单调栈 线段树

    题意:给你一个序列,问你这个序列有多少个子区间,满足把区间里的数排序之后相邻两个数之间的差 <= 1 ? 思路:https://blog.csdn.net/u013534123/article/ ...

随机推荐

  1. GIT 安装和使用

    目录 GIT 安装和使用 一.GIT 介绍 二.GIT 安装 三.GIT 使用 1. 配置 2. 创建版本库 3. 远程仓库 4. 分支管理 5.标签管理 6. 自定义 GIT 安装和使用 一.GIT ...

  2. 重学C语言之结构体

    概念 结构体是一种构造类型,由若干个成员组成,成员可以是基本数据类型,或是另一个结构体 声明结构体 struct 结构体名 { 成员列表 }; 结构体名表示结构的类型名. 声明一个结构体表示创建一种新 ...

  3. [CF254C]Anagram(2019-11-15考试)

    题目大意 给你两个长度相同的字符串\(A,B\),要求改变字符串\(A\)中最少的字符,使得字符串\(A\)在排序后和字符串\(B\)相同.输出改变后的字符串\(A\),若多解,输出字典序最小的.\( ...

  4. FusionInsight大数据开发---MapReduce与YARN应用开发

    MapReduce MapReduce的基本定义及过程 搭建开发环境 代码实例及运行程序 MapReduce开发接口介绍 1. MapReduce的基本定义及过程 MapReduce是面向大数据并行处 ...

  5. Channel延续篇

    上篇文章中介绍了NIO中的Channel,从Channel是什么.特性.分类几个方面做了下简单的介绍.但是后面Channel的分类,个人感觉不够全面,容易误导读者,特此以这篇文章加以补充. Chann ...

  6. IP地址和MAC地址绑定的必要性

    计算机网络是一个共通的网络,世界上任何计算机都可以互相访问. 实现的原理基于网络通讯的互联网交互五层模型. 计算机网络的历史发展 当计算机网络技术初始利用的时代,几台计算机通过集线器连接,就可以实现网 ...

  7. 【spring boot】【redis】spring boot基于redis的LUA脚本 实现分布式锁

    spring boot基于redis的LUA脚本 实现分布式锁[都是基于redis单点下] 一.spring boot 1.5.X 基于redis 的 lua脚本实现分布式锁 1.pom.xml &l ...

  8. html 显示 pdf

    html 显示 pdf文件四种方式: 1. <embed src="pdf/wobu.pdf" type="application/pdf" width= ...

  9. 自定义 Windows 右键菜单项

    注:本文涉及到注册表操作,不认识请不要随意修改! 右键菜单项储存在注册表 HKEY_CLASSES_ROOT 中,一般各种程序的右键菜单项都可以在此项下面找到: 添加右键菜单项 右键单击 shell, ...

  10. c#使用SoundPlayer播放wav格式音频

    1.引用System.Media名称空间下的类SoundPlayer   SoundPlayer player = new SoundPlayer(); 2.方法调用Play(); public vo ...