Codeforces 1167E 尺取法
题意:给你一个长度为n的数组,以及数组中的数的取值范围1 - m,问有多少个区间[l, r],使得删除了数组中数值为[l, r]的数之后,数组是非递减的。
思路:我们记录一下每一个数出现的最左端和最右端的位置,这样形成的若干个区间,如果数组是非递减的,那么一定是下列这种情况:范围1 - n中有若干个不相交的区间,并且区间所代表的数从左到右是递增的。所以我们想到如下算法:我们先预处理出从最右端一直向左可以找出多少个数所代表的区间不相交,然后枚举从最左端添加区间,先保证左右没有相交,然后计算答案,如果左边出现了相交的情况就break,因为后面肯定不满足答案了。
代码:
#include <bits/stdc++.h>
#define LL long long
#define INF 0x3f3f3f3f
#define db double
#define pii pair<int, int>
using namespace std;
const int maxn = 1000010;
int l[maxn], r[maxn];
int b[maxn];
LL cnt[maxn];
int main() {
LL n, m;
scanf("%lld%lld", &n ,&m);
memset(l, 0x3f, sizeof(l));
for (int i = 1; i <= n; i++) {
scanf("%d", &b[i]);
l[b[i]] = min(l[b[i]], i);
r[b[i]] = max(r[b[i]], i);
cnt[b[i]]++;
}
LL L = n + 1, R = -1, pos = -1;
LL tot = 0, ans = 0;
for (int i = m; i >= 1; i--) {
if(cnt[i] == 0) {
l[i] = l[i + 1];
continue;
}
if(r[i] < L) {
L = l[i];
} else {
tot = m - i + 1;
pos = i + 1;
break;
}
}
if(pos == -1) {
ans = (m * (m + 1)) / 2;
printf("%lld\n", ans);
return 0;
}
for (int i = 0; i <= m; i++) {
if(cnt[i] == 0) {
ans += tot;
continue;
}
if(l[i] < R) {
break;
} else {
if(cnt[i] == 0) r[i] = r[i - 1];
R = r[i];
while(L <= R && pos <= m) {
if(cnt[pos] == 0) {
tot--;
pos++;
L = l[pos];
} else {
pos++;
tot--;
L = l[pos];
}
}
ans += tot;
}
}
printf("%lld\n", ans);
return 0;
}
Codeforces 1167E 尺取法的更多相关文章
- Codeforces 1156C 尺取法 / 二分
题意:给你一个数组,问里面最多能匹配出多少对,满足abs(a[i] - a[j]) >= k; 思路:首先肯定要排序. 思路1(尺取法):看了dreamoon的代码明白的.我们可以寻找一个最长的 ...
- Codeforces 1175F 尺取法 性质分析
题意:给你一个数组,问有多少个区间,满足区间中的数构成一个排列. 思路(大佬代码):我们发现,一个排列一定含有1,所以我们不妨从1开始入手计算构成排列的区间个数.对于每个扫描到的1(假设处于位置i), ...
- [CodeForces-1225B] TV Subscriptions 【贪心】【尺取法】
[CodeForces-1225B] TV Subscriptions [贪心][尺取法] 标签: 题解 codeforces题解 尺取法 题目描述 Time limit 2000 ms Memory ...
- Codeforces Educational Codeforces Round 5 D. Longest k-Good Segment 尺取法
D. Longest k-Good Segment 题目连接: http://www.codeforces.com/contest/616/problem/D Description The arra ...
- Codeforces Round #364 (Div.2) C:They Are Everywhere(双指针/尺取法)
题目链接: http://codeforces.com/contest/701/problem/C 题意: 给出一个长度为n的字符串,要我们找出最小的子字符串包含所有的不同字符. 分析: 1.尺取法, ...
- Codeforces Round #354 (Div. 2)_Vasya and String(尺取法)
题目连接:http://codeforces.com/contest/676/problem/C 题意:一串字符串,最多改变k次,求最大的相同子串 题解:很明显直接尺取法 #include<cs ...
- codeforces 814 C. An impassioned circulation of affection 【尺取法 or DP】
//yy:因为这题多组数据,DP预处理存储状态比每次尺取快多了,但是我更喜欢这个尺取的思想. 题目链接:codeforces 814 C. An impassioned circulation of ...
- Codeforces 676C Vasya and String(尺取法)
题目大概说给一个由a和b组成的字符串,最多能改变其中的k个字符,问通过改变能得到的最长连续且相同的字符串是多长. 用尺取法,改变成a和改变成b分别做一次:双指针i和j,j不停++,然后如果遇到需要改变 ...
- CodeForces 701C They Are Everywhere 尺取法
简单的尺取法…… 先找到右边界 然后在已经有了所有字母后减小左边界…… 不断优化最短区间就好了~ #include<stdio.h> #include<string.h> #d ...
随机推荐
- ASN.1
ASN.1抽象语法标记(Abstract Syntax Notation One https://baike.baidu.com/item/ASN.1/498523?fr=aladdin
- PHP- 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5输出 ...
- 【Java学习笔记】2015.1.5
1.classpath中的“.”表示当前的路径,所以配置classpath时要注意不能忘了“.”.如果不注意,会出现cmd下运行程序时,.java文件可以编译但是不能运行: 一般的classpath配 ...
- Debug和Release区别(转)
地址:https://zhidao.baidu.com/question/629188090208609884.html 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题 ...
- pc上用C语言模拟51多任务的案例程序
#include <stdio.h> #include <stdlib.h> //任务槽个数.在本例中并未考虑任务换入换出,所以实际运行的任务有多少个, //就定义多少个任务槽 ...
- Python--面向对象的程序设计之继承实现的原理(继承顺序)、封装、property
抽象类补充: import abc class Parent(metaclass= abc.ABCMeta): x=1 @abc.abstractclassmethod def foo(self): ...
- 【Flutter学习】之 Flutter 的生命周期
一,概述 Flutter 的生命周期分为两个部分: Widget 的生命周期 App 的生命周期 二,Widget 的生命周期 Flutter 里的 Widget 分为 StatelessWidget ...
- k8s pod,pvc,pv无法删除问题
注意步骤: 一般删除步骤为:先删pod再删pvc最后删pv 但是遇到pv始终处于“Terminating”状态,而且delete不掉 pod一直删不掉 [root@hadoop01 nacos-k8s ...
- BZOJ 3569: DZY Loves Chinese II(线性基)
传送门 解题思路 首先构造出一个生成树,考虑不连接的情况.假设连通两点的非树边和树边都断掉后不连通,那么可以给所有的非树边随机一个互不相同的值,然后树边的权值为过他两端点的非树边权值的异或和,这个可以 ...
- AcWing 220.最大公约数 欧拉函数打卡
题目:https://www.acwing.com/problem/content/222/ 题意:求1-n范围内,gcd(x,y)是素数的对数 思路:首先我们可以针对每个素数p,那么他的贡献应该时 ...