2018宁夏邀请赛L Continuous Intervals
题目链接:https://nanti.jisuanke.com/t/28412
题意:
给出n个数的序列。问序列中有多少个区间满足,排序完之后任意两个相邻的数之差不大于1。
题解:
用max表示区间最大值,min表示区间最小值,cnt表示区间数字的种数。那么问题转化成求max-min=cnt+1的区间数。
用线段树维护每个区间的max-min-cnt最小值及最小值的个数,不用单独维护max,min和cnt。注意max-min >= cnt+1.
从1~n枚举R。对于每个枚举的R,更新以R为后缀的[L,R]区间的max-min-cnt值。
对于max和min可以用单调栈维护,max和min对max-min-cnt的贡献采用区间加减的形式而不是区间覆盖。
对于cnt可以用一个vis[]数组维护上一次的出现位置,然后也进行区间加减。数据是1e9的,vis[]数组可以离散一下或者用map代替。
最后对于每一个枚举的R,统计max-min-cnt的值为-1的[L,R]数。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+;
typedef long long ll;
int t, n, k;
int nx, nn;
int lzy[N*], sum[N*], val[N*];
ll ans;
map<int, int> m;
struct node {
int p, w;
node() {}
node(int a, int b) {
p = a; w = b;
}
}mx[N], mn[N];
void push_up(int id) {
val[id] = min(val[id<<], val[id<<|]);
if(val[id<<] == val[id<<|]) sum[id] = sum[id<<]+sum[id<<|];
else if(val[id<<] < val[id<<|]) sum[id] = sum[id<<];
else sum[id] = sum[id<<|];
}
void push_down(int id) {
lzy[id<<] += lzy[id];
lzy[id<<|] += lzy[id];
val[id<<] += lzy[id];
val[id<<|] += lzy[id];
lzy[id] = ;
}
void insert(int id, int l, int r, int p) {
if(l == r) {
val[id] = -;
sum[id] = ;
return ;
}
if(lzy[id]) push_down(id);
int mid = l+r>>;
if(p<=mid) insert(id<<, l, mid, p);
else insert(id<<|, mid+, r, p);
push_up(id);
}
void update(int id, int l, int r, int ql, int qr, int v) {
if(ql<=l && r<=qr) {
lzy[id] += v;
val[id] += v;
return ;
}
if(lzy[id]) push_down(id);
int mid = l+r>>;
if(ql<=mid) update(id<<, l, mid, ql, qr, v);
if(qr>mid) update(id<<|, mid+, r, ql, qr, v);
push_up(id);
}
int main() {
scanf("%d", &t);
for(int casee = ; casee <= t; casee++) {
ans = nx = nn = ;
m.clear();
scanf("%d", &n);
memset(lzy, , sizeof(int)*(*n+));
memset(sum, , sizeof(int)*(*n+));
memset(val, 0x3f3f3f3f, sizeof(int)*(*n+));
for(int i = ; i <= n; i++) {
scanf("%d", &k);
insert(, , n, i);
int p = i, v;
while(nx > && mx[nx].w <= k) {
p = mx[nx].p, v = k-mx[nx].w;
nx--;
update(, , n, mx[nx].p+, p, v);
}
mx[++nx] = node(i, k);
p = i;
while(nn > && mn[nn].w >= k) {
p = mn[nn].p, v = k-mn[nn].w;
nn--;
update(, , n, mn[nn].p+, p, -v);
}
mn[++nn] = node(i, k);
int l;
if(m.find(k) != m.end()) l = m[k]+;
else l = ;
if(l <= i-) update(, , n, l, i-, -);
m[k] = i;
ans += sum[];
}
printf("Case #%d: %lld\n", casee, ans);
}
}
2018宁夏邀请赛L Continuous Intervals的更多相关文章
- 2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树)
2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树) 传送门:https://nanti.jisuanke.com/t/41296 题意: 给一个数列A 问在数列A中有多 ...
- 2018宁夏邀请赛 L. Continuous Intervals
转化一下询问即为区间$max - min + 1 = cnt$,其中$cnt$表示区间内数的种类数. 即求有多少区间$max - min - cnt=-1$,注意到任意区间的$max-min-cnt ...
- “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/ ...
随机推荐
- [转]不让iTunes备份到c盘
很多人现在的C盘都是空间不大的SSD硬盘,ITUNES备份老是占越来越大的空间,不如动手把它改成其它盘好了.下面7个步骤教你转移备份. 1.需要一个小工具:Juction.exe,如果你已经是WIN7 ...
- Python特别low的一个文字游戏
闲来无事 ,调侃舍友的游戏 import os class Role(): def __init__(self,name,sex,fighting): self.name=name self.sex= ...
- ESP32 LyraT音频开发板试玩(一):搭建开发环境
我是卓波,很高兴你来看我的博客. 系列文章: ESP32 LyraT音频开发板试玩(一):搭建开发环境 ESP32 LyraT音频开发板试玩(二):播放音乐 关于ESP32的开发环境搭建,官方有教程, ...
- 004---os & sys
os模块和sys模块 这两个模块都提供了很多与操作系统之间交互的功能 使用 import os #当前脚本的工作目录,不是脚本目录 print(os.getcwd()) # 获取指定目录下的所有文件和 ...
- Blah数集
Blah数集 描述 大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基的集合Ba定义如下: (1) a是集合Ba的基,且a是Ba的第一个元素: (2)如果x在集合Ba中,则2x+1 ...
- python2.7练习小例子(十九)
19):题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半:再落下,求它在第10次落地时,共经过多少米?第10次反弹多高? #!/usr/bin/python # -*- codi ...
- 初步学习pg_control文件之五
接前文 初步学习pg_control文件之四,继续看何时出现 DB_IN_CRASH_RECOVERY: 看下面代码就比较清楚了:如果对 InArchiveRecovery 判断值为假,而且 读取出 ...
- 58HouseSearch项目迁移到asp.net core
前言 58HouseSearch这个项目原本是基于ASP.NET MVC 4写的,开发环境是Windows+VS2015,发布平台是linux+mono+jexus,这样看来整个项目基本已经满足跨平台 ...
- torndb在python3中运用
#连接数据库:db = torndb.Connect() #查询一条的数据get() #查询多行的数据query() #创建数据表,数据库execute() #插入一条数据:sql = "i ...
- SXOI2018游记
day0 动身去太原.太原五中虽然挺小的但是很好看啊qwq(进门口一个"通天堂"(逃 试机.似乎看到了__stdcall!!然而没敢去认orz.linux选手似乎是9个.准考证(一 ...