题目链接: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. 监听浏览器返回,pushState,popstate 事件,window.history对象

    在WebApp或浏览器中,会有点击返回.后退.上一页等按钮实现自己的关闭页面.调整到指定页面.确认离开页面或执行一些其它操作的需求.可以使用 popstate 事件进行监听返回.后退.上一页操作. 一 ...

  2. jenkins邮件发送jmeter接口测试报告

    在Jenkins中配置实现邮件通知,Jenkins提供了两种方式的配置. 一种是Jenkins内置默认的邮件通知,但是它本身有很多局限性,比如它的邮件通知无法提供详细的邮件内容.无法定义发送邮件的格式 ...

  3. C++拷贝构造函数 的理解

    #include <iostream> using namespace std; //拷贝构造函数的理解 class Point { public: Point(); Point(int ...

  4. ABAP CDS ON HANA-(8)算術式

    Arithmetic expression in CDS View Allowed Arithmetic operators in CDS view. CDS View- @AbapCatalog.s ...

  5. angularjs post data

    //post json 时收不到数据,目前只找到方法post form形式的key-value值 //关键是设置  headers: { 'Content-Type': 'application/x- ...

  6. 新版IdFTP解决中文乱码问题

    用XE10后开发FTP客户端,发现有中文乱码问题.这里也主要是编码的问题,在connect链接后,需要设置编码方可. 注意:  IndyTextEncoding_OSDefault;   该代码可能需 ...

  7. P2419 [USACO08JAN]牛大赛Cow Contest

    P2419 [USACO08JAN]牛大赛Cow Contest 题目背景 [Usaco2008 Jan] 题目描述 N (1 ≤ N ≤ 100) cows, conveniently number ...

  8. Coap协议学习笔记-第一篇

    1. 物联网应用上一般使用单片机(或者其他SOC),单片机的RAM内存一般只有20KB~~128KB左右,然而一个TCP协议栈可能就20KB,所以只能用UDP,因为UDP相对小很多,然后在UDP上加了 ...

  9. MyEclipse - 问题集 - Java compiler level does not match the version of the installed Java project facet

    右键项目“Properties”,在弹出的“Properties”窗口左侧,单击“Project Facets”,打开“Project Facets”页面. 在页面中的“Java”下拉列表中,选择相应 ...

  10. 解决上传app store卡在正在通过iTunes Store鉴定

    打开终端输入代码即可 cd ~ mv .itmstransporter/ .old_itmstransporter/ "/Applications/Xcode.app/Contents/Ap ...