2018宁夏邀请赛 L. Continuous Intervals
转化一下询问即为区间$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的更多相关文章
- 2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树)
2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树) 传送门:https://nanti.jisuanke.com/t/41296 题意: 给一个数列A 问在数列A中有多 ...
- 2018宁夏邀请赛L Continuous Intervals
题目链接:https://nanti.jisuanke.com/t/28412 题意: 给出n个数的序列.问序列中有多少个区间满足,排序完之后任意两个相邻的数之差不大于1. 题解: 用max表示区间最 ...
- “2018宁夏邀请赛 ” 兼 “The 2019 Asia Yinchuan First Round Online Programming”
------------7题弟弟,被各位半小时13题的大佬打惨了(滑稽)---------- 签到题就不写了. F :Moving On (1247ms) 题意:给定大小为N的带 ...
- 2018宁夏邀请赛 Continuous Intervals(单调栈 线段树
https://vjudge.net/problem/Gym-102222L 题意:给你n个数的序列,让判断有几个区间满足排完序后相邻两数差都不大于1. 题解:对于一个区间 [L,R],记最大值为 m ...
- 2018宁夏邀请赛网赛 I. Reversion Count(java练习题)
题目链接 :https://nanti.jisuanke.com/t/26217 Description: There is a positive integer X, X's reversion c ...
- 2018宁夏邀请赛K Vertex Covers
题目链接:https://nanti.jisuanke.com/t/28411 题意: 给出n(n<=36)个点的一个图.求点覆盖集数. 题解: 将n个点折半为L和R两部分.对于R内部的边,枚举 ...
- 2018宁夏邀请赛G(DFS,动态规划【VECTOR<PAIR>】)
//代码跑的很慢四秒会超时,结尾附两秒代码(标程) #include<bits/stdc++.h>using namespace std;typedef long long ll;cons ...
- 2018宁夏邀请赛K题Vertex Covers(高维前缀和 状压 折半
https://vjudge.net/problem/Gym-102222K 题意:给定N点M边的无向图,每个点有点权. 点覆盖表示某个点集S{}覆盖了所有的边,其贡献是S中点权之积. 现在让你求所 ...
- 2018ICPC银川 L Continuous Intervals 单调栈 线段树
题意:给你一个序列,问你这个序列有多少个子区间,满足把区间里的数排序之后相邻两个数之间的差 <= 1 ? 思路:https://blog.csdn.net/u013534123/article/ ...
随机推荐
- Faiss的学习和入门文章
可以看这里的文章: https://www.leiphone.com/news/201703/84gDbSOgJcxiC3DW.html https://waltyou.github.io/Faiss ...
- 由一个问题引起的思考:WEB开发中,使用JSON-RPC好,还是RESTful API好?
起因: 研究zabbix的API设计风格.查看zabbix官网API文档,可以看到使用的是json-rpc:2.0 随后搜索到知乎上的一个问题讨论:https://www.zhihu.com/ques ...
- Mysql 命令 load data infile 权限问题
[1]Mysql命令load data infile 执行权限问题 工作中,经常会遇到往线上环境mysql数据库批量导入源数据的场景. 针对这个场景问题,mysql有一个很高效的命令:load dat ...
- 【Rust】Rust的安装和配置
-----------------------参考文档------------------------------------- https://www.rust-lang.org/tools/ins ...
- CentOS修改ulimit
一.概述 查看limit配置 # ulimit -a core data seg size (kbytes, -d) unlimited scheduling priority (-e) file s ...
- latex在vim中的代码片段
Gilles Castel写的vim中使用的代码片段,质量很高,原文:https://github.com/gillescastel 下载后,存放到 ~/.vim/plugged/ultisnips/ ...
- NetCore 统一处理 webapi 返回null 转为“”
数据库中部分表字段允许空值,则代码中实体类对应的字段类型为可空类型Nullable<>,如int?,DateTime?,null值字段序列化返回的值都为null,前端对应字段赋值需要做nu ...
- 【转】socket通信-C#实现udp通讯
在日常碰到的项目中,有些场景下不适合使用tcp常连接,而需要靠UDP无连接的数据收发.那么如何使用SharpSocket完成UDP收发数据呢?其中要掌握的关键点是什么呢? 点击查看原博文内容
- Wireshark教程之二:Wireshark捕获数据分析
使用 Wireshark 选择需要抓包的网络方式,并设置过滤器条件,当有数据通信后即可抓到对应的数据包,这里将分析其每一帧数据包的结构. 以HTTP协议为例,一帧数据包一般包括以下几个部分: Fram ...
- (转)二步实现 远程连接 阿里云SqlServer 2012 数据库服务器
前言:在使用 阿里云 上的一些产品时,遇到不少坑. 安装IIS 时,遇到 因买的配置过低,虚拟内存不足,而导致 IIS 总是安装失败: 现在 在上面安装了个 Sql Sever 2012,远程老是 不 ...