E. Range Deleting

首先不难知道如果f(l,r)f(l,r)f(l,r)满足题意,那么f(l,r+1),f(l,r+2),…,f(l,x)f(l,r+1),f(l,r+2),\dots,f(l,x)f(l,r+1),f(l,r+2),…,f(l,x)都满足题意。
因而对于每一个左端点lll,需要找到最小的一个右端点rrr

单调性:对于每一个左端点lll,当左端点右移(增大)的过程中,右端点也一定右移(增大)
有了上述单调性考虑双指针表示f(i,j)f(i,j)f(i,j)

预处理出以下数组
①:l[i]值是i的最小数组下标
②:r[i]值是i的最大数组下标
③:ll[i]值是i~x的最小数组下标
④:rr[i]值是1~i的最大数组下标

对于一个区间[l,r][l,r][l,r],假设值在[1,l−1][1,l-1][1,l−1]以及[r+1,x][r+1,x][r+1,x]内部不存在逆序对,只需要判断[1,l−1][1,l-1][1,l−1]和[r+1,x][r+1,x][r+1,x]之间是否存在逆序对即值在[1,l−1][1,l-1][1,l−1]最大数组下标是否大于[r+1,x][r+1,x][r+1,x]最小数组下标即如果存在逆序对(rr[l-1]<ll[r+1])不满足条件,只需根据此调整双指针位置。

对于假设条件,显然可以求出对于[1,pl)[1,pl)[1,pl)内部不存在逆序对,以及(pr,x](pr,x](pr,x]内部不存在逆序对,因而只需要让指针iii在[1,pl][1,pl][1,pl]之间,而指针jjj在[pr,x][pr,x][pr,x]之间即可。

#define IO ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr)
#pragma GCC optimize(2)
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
constexpr int N=1000010;
int a[N],n,x;
int l[N],r[N],ll[N],rr[N];
int main()
{IO;cin>>n>>x;memset(l,0x3f,sizeof l);memset(ll,0x3f,sizeof ll);memset(r,-1,sizeof r);memset(rr,-1,sizeof rr);for(int i=1;i<=n;i++){cin>>a[i];l[a[i]]=min(l[a[i]],i);r[a[i]]=max(r[a[i]],i);}// rr[i] 1~i最右边的位置// ll[i] i~x最左边的位置for(int i=1;i<=x;i++) rr[i]=max(rr[i-1],r[i]);for(int i=x;i>=1;i--) ll[i]=min(ll[i+1],l[i]);long long res=0;// [1,pl) 以及 (pr,x] 不存在逆序对int pl=1,pr=x;while(pl<=x&&rr[pl-1]<=l[pl]) pl++;while(pr>=1&&ll[pr+1]>=r[pr]) pr--; for(int i=1,j=pr;i<=pl;i++){while(j<=x&&(j<i||rr[i-1]>=ll[j+1])) j++;res+=x-j+1;}cout<<res<<'\n';return 0;
}

要加油哦~

codeforces1167 E. Range Deleting(双指针)相关推荐

  1. python编程新手常犯的错误_Python程序员常犯的10个错误

    BY- SENIOR SOFTWARE ENGINEER @TOPTAL About Python 关于Python Python is an interpreted, object-oriented ...

  2. [转]python各模块的学习

    [-] 01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 ...

  3. 双指针问题最简单的教程(1)

    什么样的问题适合用双指针技巧?当问题是从一个有序的数组或链表中,找到一个元素的子集,该子集需要满足某种限制. 这时候就特别适合用双指针.这个子集可能是某两个元素,某三个元素,甚至是一个子数组. 1 举 ...

  4. 7. Leetcode 611. 有效三角形的个数 (数组-双向双指针)

    给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数.示例 1:输入: [2,2,3,4] 输出: 3 解释: 有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 ( ...

  5. 5. Leetcode 15. 三数之和 (数组-双向双指针)

    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组.注意:答案中不可以包含重复的三元 ...

  6. 七十五、栈+双指针,头条当年接雨水问题

    @Author:Runsen @Date:2020/09/30 清晨的时候,熟睡中的我被咯吱咯吱作响的窗子吵醒,起身一看,窗外正是狂风大作,不一会儿便下起了爆雨,来也快,去也快,不一会儿天亮便放晴了, ...

  7. LeetCode——双指针

    双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务. 目录 有序数组的 Two Sum 两数平方和 反转字符串中的元音字符 回文字符串 归并两个有序数组 判断链表是否存在环 最长 ...

  8. 602B. Approximating a Constant Range

    B. Approximating a Constant Range:题目 可恶啊,不知道为什么我双指针的代码不过,重新写了个..... #include <bits/stdc++.h> u ...

  9. 算法(10)-leetcode-explore-learn-数据结构-链表双指针技巧

    leetcode-explore-learn-数据结构-链表2 1.概述 2.例题 2.1 环形链表判断 2.2 环形链表2 2.3 相交链表 2.4 删除链表的倒数第N个节点 3.小结 本系列博文为 ...

最新文章

  1. python的异常处理机制
  2. 第三次学JAVA再学不好就吃翔(part103)--BufferedInputStream和BufferOutputStream
  3. 从迁移到Java 7的小技巧
  4. 解决win10使用GPU跑程序遇到的一系列报错
  5. 互联网裁员屡见不鲜,但有时互联网的裁员却不太体面
  6. 【Datapump】expdp和impdp中parallel参数解释
  7. 戒指戴在不同手指上的含义
  8. Xcode6中如何添加pch文件
  9. 怀恋曾经老飞飞那些厉害的功能总结贴2023
  10. 如何创建一个最简单的Windows桌面应用程序 (C++)
  11. lua 随机数 math.random()和math.randomseed()用法
  12. 符合Scorm的LMS系统
  13. 家用洗地机怎么选?2023高性价比家用洗地机推荐
  14. 一款非常不错的高仿UC浏览器源码下载
  15. Android lunch分析以及产品分支构建
  16. 谷歌404页面html,简洁404页面HTML好看的404错误页源码
  17. 用CH340模块进行程序烧写以及供电
  18. GetTickCount() 的另一种实现方法
  19. 【论文阅读】 Privacy-Preserving Byzantine-Robust Federated Learning via Blockchain Systems
  20. java怎么做沙子合并,那些java沙子游戏如何跟踪这么多粒子?

热门文章

  1. 金蝶凭证序时簿在哪_来了!金蝶日常账务处理大全
  2. linux配置文件引用时间,linux时间设置、screen使用、命令分类、hash作用、命令引用及history命令...
  3. lnmp无法远程连接mysql_MySQL(一):设置root 可以远程连接MySQL
  4. python变量类型怎么决定的_Python数据类型提示痛点的解决方案探讨
  5. 数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型的概念
  6. [C++11]常量表达式函数
  7. [Java基础]SimpleDateFormat类基础
  8. Bridge(桥接)--对象结构模式
  9. 挖矿为什么要用显卡_数字货币行情分析 2020/07/17 为什么大佬们都转向显卡挖矿了?...
  10. 双向dcdc变换器simulink仿真_二极管箝位五电平变换器Simulin仿真