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 ...
随机推荐
- python实现发送文本邮件
简单实现了python发送文本邮件 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/4/25 17:09 # @Author ...
- Java集合框架的基础接口有哪些?
Collection为集合层级的根接口.一个集合代表一组对象,这些对象即为它的元素.Java平台不提供这个接口任何直接的实现. Set是一个不能包含重复元素的集合.这个接口对数学集合抽象进行建模,被用 ...
- 开发react 应用最好用的脚手架 create-react-app
安装 npx create-react-app my-app cd my-app npm start 安装后之后,就是这样的了 配置 这样的”零配置”没法满足我们的需求,我们需要自定义,需要加一些 l ...
- 树形查询sql
DROP FUNCTION IF EXISTS PersonName; CREATE FUNCTION PersonName(parent_id smallint) RETURNS VARCHAR(2 ...
- 0xC0000005: 写入位置 0x00000000 时发生访问冲突的解决办法(转)
上面的意识就是你吧值付给了不该赋给的变量,或者说你把值付给了不能付给的变量(或者常量) ()最简单也最直接的错误可能就是scanf()的问题,我们都知道输入的时候都是scanf("%格式&q ...
- oracle死锁查询
select sess.sid ||','|| sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked ...
- js保留两位小数,自动补充零
function returnFloat(value){ var value=Math.round(parseFloat(value)*100)/100; var xsd=value.toStri ...
- Java 设计模式-【单例模式】
单例解决了什么问题:为了节约系统资源,有时需要确保系统中某个类只有唯一一个实例,当这个唯一实例创建成功之后,我们无法再创建一个同类型的其他对象,所有的操作都只能基于这个唯一实例.为了确保对象的唯一性, ...
- mysql学习-join的使用
sql的执行顺序是从from 开始 join图
- jmeter之--断言json响应&json path espressions的语法
一.提取所需要断言的内容: 响应数据如下:加入需要提取id为90的值 { , "name" : "python", "url" : &quo ...