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/ ...
随机推荐
- 【shell脚本学习-4】
文本处理 #!/bin/bash#----------文本处理---------- #---------------echo----------------- # "-n":处理光 ...
- 【Linux】Nginx无法加载.woff .eot .svg .ttf问题解决
只需要修改Nginx的vhosts.ini,加上以下代码即可修复该问题 location ~ \.(eot|otf|ttf|woff|woff2|svg)$ { add_header Access-C ...
- wamp环境下安装imagick扩展
先上图,如下是安装成功后的phpinfo()界面: 安装步骤: 1.先确定安装版本,比如我的的php : php7.0.12 x86 ts 那么就需要三方版本 要一致:imagick软件本身( 如x ...
- [转]Centos7 内核从3.10升级到4.12过程
[原文地址] http://blog.csdn.net/youshijifen/article/details/73472434 [摘要] 近期,国家互联网应急中心漏洞(CNCERT)公告中提到Lin ...
- 关于nodejs DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
const mongoose = require('mongoose') mongoose.connect("mongodb://localhost:27017/study", { ...
- centos配置npm全局安装
使用-g全局安装在服务器需要配置,下面看看配置方法 配置全局安装路径和缓存路径 cd /usr/local/nodejs mkdir node_global mkdir node_cache npm ...
- python2.7入门---运算符 &案例
已经分享过变量类型的基本概念了,接下来就研究了一下运算符的基础知识.接下来我们就来看一下内容.举个简单的例子 4 +5 = 9 .例子中,4 和 5 被称为操作数,"+" ...
- ajax设置自定义头
一.setting参数 headers $.ajax({ headers: { Accept: "application/json; charset=utf-8" ...
- "Cannot open source file "Wire.h" " in Arduino Development
0. Environment Windows 8 x64 Arduino 1.0.5 Visual studio 2012 Visual micro Arduino 1. Steps Add &quo ...
- 【个人训练】(POJ1837)Balance
这几天抓住国庆的黄金时间(因为没有女朋友,天天刷题emmmm 其实还在肝少前还要捞秋刀鱼) ,重点攻克掉几个基本的地方:搜索.dp.图论.这几天的题目应该就是这些范围. 题意 原题的意思大概是这样的, ...