题目链接: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的更多相关文章

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

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

  2. 2018宁夏邀请赛 L. Continuous Intervals

    转化一下询问即为区间$max - min + 1 = cnt$,其中$cnt$表示区间内数的种类数. 即求有多少区间$max - min - cnt=-1$,注意到任意区间的$max-min-cnt ...

  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. 【nat---basic,napt,easy ip】

    display nat :显示nat 信息 debugging nat :对nat进行调试 reset nat session:擦除nat连接配置 basic-nat:公网->私网(一对一) n ...

  2. ThinkPHP创建应用

    新建一个文件 引入ThinkPHP文件

  3. 误删 EhCache 中的数据?

    最近遇到一个问题:在使用ehcache时,通过CacheManager.getCache(chachename).get(key),获取相应的缓存内对象(当时这个对象是个list), 有个同事写个方法 ...

  4. python -pickle模块、re模块学习

    pickel模块 import pickle #pickle可以将任何数据类型序列化,json只能列表字典字符串数字等简单的数据类型,复杂的不可以 #但是pickle只能在python中使用,json ...

  5. haproxy + keepalived 实现高可用负载均衡集群

    1. 首先准备两台tomcat机器,作为集群的单点server. 第一台: 1)tomcat,需要Java的支持,所以同样要安装Java环境. 安装非常简单. tar xf  jdk-7u65-lin ...

  6. 使用postgresql作为cm的数据库时候添加报错

    如下图,当postgresql安装成功,建立好数据库scm,rman,amon之后,添加cm对应服务报错hadoopNode2没有相应数据库: No database server found run ...

  7. centos下搭建svn服务器端/客户端

    1.安装 yum install subversion httpd mod_dav_svn 2.创建仓库存储代码 mkdir /var/repos svnadmin create /var/repos ...

  8. Django笔记 —— 高级视图和URL配置

    最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...

  9. python正则-字符串处理,主要用于处理请求参数格式为application/x-www-form-urlencoded的表单数据

    #当提交的表单数据格式为application/x-www-form-urlencoded,直接从浏览器复制出来的格式是str_lin(chrome,也是最常见的)或者str_in2(火狐)这两种格式 ...

  10. 接口测试工具postman(三)添加断言

    每个用例执行完成后,可以通过添加断言来判断返回结果是否正确,即表示用例执行是否成功. 官方说明文档:https://learning.getpostman.com/docs/postman/scrip ...