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/ ...
随机推荐
- 第三节:EF Core上下文DbContext相关配置和生命周期
一. 配置相关 1. 数据库连接字符串的写法 (1).账号密码:Server=localhost;Database=EFDB01;User ID=sa;Password=123456; (2).win ...
- 递推 + 高精度 --- Tiling
Tiling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7264 Accepted: 3528 Descriptio ...
- Delphi阿里云邮件推送【支持单一发信、邮件批量发送和获取指定条件下的发送数据】
作者QQ:(648437169) 点击下载➨Delphi阿里云邮件推送 阿里云api文档 [Delphi阿里云邮件推送]支持SingleSendMail(单一发信接口). ...
- 【题解】Editor [HDU4699]
[题解]Editor [HDU4699] 传送: \(Editor\) \([HDU4699]\) [题目描述] 有一个维护整数序列的强大编辑器,初始状态为空,下面提供五种不同的操作,给出的总操作次数 ...
- - Gradle 翻译 Analyzer APK文件分析 MD
目录 目录 APK文件分析 使用 APK 分析器分析您的编译版本 查看文件和大小信息 查看 AndroidManifest.xml 查看 DEX 文件 过滤DEX文件树视图 加载 Proguard 映 ...
- C# - List.Sort()自定义排序方法
本文通过示例介绍了C#中典型容器List.Sort()的自定义排序方法,进而引出了C#中自定义排序的核心接口及方法 项目地址:自定义Sort方法 - SouthBegonia's Github Lis ...
- php调用webservice接口,java代码接收不到参数
前段时间做了一个项目的二次开发,有个功能是需要php调用java实现的webservice接口,并传递一些参数给接口,然后按照对方提供的接口说明文档进行传参调用,java那边有接收到请求,但是参数总是 ...
- vue中的插槽
匿名插槽 // comp1 <div> <slot></slot> </div> // parent <comp>hello</com ...
- Dubbo 几个很实用但是很少人知道的功能
dubbo功能非常完善,很多时候我们不需要重复造轮子,下面列举一些你不一定知道,但是很好用的功能; 直连Provider 在开发及测试环境下,可能需要绕过注册中心,只测试指定服务提供者,这时候可能需要 ...
- Win10下免安装版MySQL5.7的安装和配置
1.MySQL5.7解压 2.新建配置文件my.ini放在D:\Free\mysql-5.7.26-winx64目录下 [mysql] # 设置mysql客户端默认字符集 default-charac ...