题意:给你一个长度为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;
}

  

转载于:https://www.cnblogs.com/pkgunboat/p/10877539.html

Codeforces 1167E 尺取法相关推荐

  1. Longest k-Good Segment CodeForces - 616D(尺取法)

    The array a with n integers is given. Let's call the sequence of one or more consecutive elements in ...

  2. Vasya and String CodeForces - 676C(尺取法)

    High school student Vasya got a string of length n as a birthday present. This string consists of le ...

  3. Codeforces Round #364 (Div. 2)C. They Are Everywhere(尺取法)

    题目链接: C. They Are Everywhere time limit per test 2 seconds memory limit per test 256 megabytes input ...

  4. Codeforces 1548B Integers Have Friends 尺取法 Hdu 7073 Integers Have Friends 2.0 力能扛鼎随机算法

    文章目录 题意 题解 CF1548B 题解 Hdu 7073 CF1548B HDU7073 题意 定义数的好友组为一个集合SSS,取正整数m>1,∀x∈s,xmodmm>1,\foral ...

  5. B. Complete the Word (尺取法)

    题目链接:http://codeforces.com/problemset/problem/716/B 题目大意:字符串中的 '?' 可以用A->Z任何一个来替换 问能不能通过替换使字符串有一个 ...

  6. QDUOJ 河老师的新年礼物(尺取法)

    河老师的新年礼物 发布时间: 2017年1月1日 15:11   最后更新: 2017年1月1日 15:13   时间限制: 1000ms   内存限制: 256M 描述 河老师的新年礼物是一个长度为 ...

  7. #尺取法# 尺取法总结和经典例题

    题目链接:POJ3061 Subsequence 题目链接:Educational Codeforces Round 11C. Hard Process 题目链接:UVA11572 - Unique ...

  8. CF660C Hard Process(尺取法)

    整理的算法模板合集: ACM模板 尺取法 题目中要我们求最多改变k次后连续的1的最长长度.那么转换一下,不就是求至多包含k个0的子串的最长长度吗? 直接套用尺取法的思想,维护两端点,一旦0的个数超过k ...

  9. 【常用技巧精选】尺取法

    整理的算法模板合集: ACM模板 目录 1.反向扫描 1 找指定和的整数对 A.UVA1121 Subsequence B.POJ 3320 Jessica's Reading Problem C.l ...

最新文章

  1. Spring Initializr 构建Spring Boot/Cloud工程
  2. C/C++从源代码到生成可执行程序的过程详解!
  3. [原]SDL开发教程
  4. python调用lib_基于python调用libvirt API
  5. gridcontrol 控件的用法
  6. dvd管理器java,简单DVD管理-java练习题
  7. lumion自动保存_LUMION吊打MAX,轻松玩转规划渲染!
  8. unity, undo
  9. 我忽然发现我写的cve漏洞管理系统简直就是redmine的一个小模块
  10. 2021年安全员-C证(安徽省)考试试卷及安全员-C证(安徽省)试题及解析
  11. 全国所有地级行政区(城市)JSON(按拼音首字母排列)
  12. java后台对接app微信支付
  13. 院校-国外-美国:斯坦福大学( Stanford)
  14. 进程管理——PV操作
  15. 苹果手机投影_智能手机投屏到投影仪
  16. JAVA abstract
  17. 加速乐jsl逆向-11题---有点特殊的jsl
  18. Go 编写开机自启动服务
  19. 王桂林 C++基础与提高 练习题—— 函数做默认参数
  20. 计算机术语blob是什么东西?( binary large object,二进制大对象,是一个可以存储二进制文件的容器)(典型的BLOB是一张图片或一个声音文件)

热门文章

  1. description
  2. GameObject.Find 使用技巧
  3. 操作系统:进程间的相互作用(多线程基础)
  4. 数据库_初学语句 in的用法
  5. 受网友U2U之托,DevComponents出品的TreeGX最新版本Patch出炉
  6. Flutter 绘图 Paint strokeCap 延伸类型 strokeJoin 拐角类型 图文分析
  7. vue中v-model指令的使用之Vue知识点归纳(九)
  8. java基础—Objcet中的equals方法重写
  9. kingbase7获取唯一索引和子分区键的view
  10. 4.13 | 学习笔记