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 ...
随机推荐
- 案例:使用xml存储数据
HTML: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- node 添加个人经历的接口
1.定义experience const profileFields = {}; profileFields.experience=[]; 2.查找用户id const profile = await ...
- git注意事项
1,在github中新建空的工程,第一次提交代码的时候 使用命令 $ git push -u origin master -f 后面就直接push就行了
- C语言小笔记(1)
枚举类型的大小是4,和一个int整形大小一样 就是最后一个逗号后面的表达式的值,比如: int a=1,b; b=(a+1,a+2,a+3); 那么b的值就是a+3,也就是4 函数名 :print ...
- 百度地图,删除marker,创建marker
-------------------[删除marker]-----------------------------success: function(data){ if(data.length> ...
- boost库:多线程
1.线程管理 最重要的一个类是boost::thread,是在boost/thread.hpp里定义的,用来创建一个新线程. #include <boost/thread.hpp> #in ...
- MaxCompute问答整理之10月
本文是基于本人对MaxCompute产品的学习进度,再结合开发者社区里面的一些问题,进而整理成文.希望对大家有所帮助. 问题一.DataStudio中是否可以通过shell节点调取MaxCompute ...
- NVMe SSD是什么?
https://blog.51cto.com/alanwu/1766945 一直对闪存存储关注的朋友对NVMe SSD一定非常熟悉,NVMe SSD是现如今性能最好的存储盘.这种高性能盘在互联网领域已 ...
- CDN技术之-介绍
“第一公里”是指万维网流量向用户传送的第一个出口,是网站服务器接入互联网的链路所能提供的带宽.这个带宽决定了一个网站能为用户提供的访问速度和并发访问量.如果业务繁忙,用户的访问数越多,拥塞越严重,网站 ...
- (转)MAVEN的安装和Myeclipse+maven的配置和使用
转:https://blog.csdn.net/shikongshengzhu/article/details/51779159 MAVEN的安装和Myeclipse+maven的配置和使用 步骤如下 ...