首页 > 其他分享 >从CF1935B学习维护前后缀区间mex

从CF1935B学习维护前后缀区间mex

时间:2024-03-10 14:11:21浏览次数:30  
标签:std preMex 后缀 ++ int sufMex mex CF1935B

Problem - B - Codeforces

维护前缀区间mex和后缀区间mex,枚举二者相同的断点

原理

随区间增长,\(\texttt{mex}\) 只可能增,不可能减,所以可以用一个变量维护目前的 \(mex\),区间扩大后可以直接沿用较小区间的 \(mex\),再处理增加即可。

维护 \(\texttt{mex}\)

std::set<int> S;//当前集合内的元素
int mex(0);//当前mex
for (int i = l; i < r; i++) {
	S.insert(a[i]);
    while(S.contains(mex)) {
		mex++;
    }
}

代码

void solve() {
    int n;
    std::cin >> n;
    std::vector<int> a(n);
    for (auto& x : a) std::cin >> x;
    std::set<int> preS, sufS;
    std::vector<int> pre(n), suf(n);
    int preMex(0), sufMex(0);
    for (int i = 0; i < n; i++) {
        preS.insert(a[i]);
        while(preS.contains(preMex)) {
            preMex++;
        }
        pre[i] = preMex;
    }
    for (int i = n - 1; i >= 0; i--) {
        sufS.insert(a[i]);
        while(sufS.contains(sufMex)) {
            sufMex++;
        }
        suf[i] = sufMex;
    }
    for (int i = 0; i < n; i++) {
        if (pre[i] == suf[i + 1]) {
            std::cout << 2 << '\n';
            std::cout << 1 << ' ' << i + 1 << '\n';
            std::cout << i + 1 + 1 << ' ' << n << '\n';
            return ; 
        }
    }
    error; return ;
}

标签:std,preMex,后缀,++,int,sufMex,mex,CF1935B
From: https://www.cnblogs.com/kdlyh/p/18064128

相关文章

  • [蓝桥杯 2019 省 B] 后缀表达式
    这题没想到怎么贪心,看题解恍然大明白#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;typedeflonglongLL;constintN=2e5+5;LLans;in......
  • abc330E 单点更新后的Mex
    题面:给定长为n的数组A,有q组询问,每次将A[i]修改为x[i],输出每次修改后A的mex值。范围:n,q<2E5;A[i],x[i]<1E9思路:注意到,长度为n的数组,其mex值最大为n。因此,用set维护0~n中没有出现在A中的数,同时用map维护A中各数的现次数。#include<bits/stdc++.h>usingnamespacestd;#define......
  • abc284F 前缀+逆序+后缀
    题面:给一个长度为2n的字符串T,问是否存在长度为n的字符串S,满足:T=S的前缀+整串S逆序+S的后缀。范围:n<=1e6思路:字符串哈希,枚举S的起点逐一判断,如果前i个字符加后n-i个字符组成的长为n的字符串,正好和中间串的逆序相同,则为解。#include<bits/stdc++.h>usingnamespacestd;......
  • 后缀数组学习笔记
    后缀数组学习笔记定义所谓后缀,指的是对于一个字符串\(s\),如果它的下标从\(1\)到\(n\),那么对于\(s\)的一个后缀\(i=s[i\dotsn]\)。所谓后缀数组sa[],就是按照这些后缀的字典序排序后得到的数组。更具体的,后缀数组sa[i]中存储的是字符串\(s\)中排名为\(i\)的后缀的......
  • 并查集解mex_cf932_B. Informatics in MAC
    目录题目概述思路想法参考代码做题反思题目概述原题参考:B.InformaticsinMAC给出一个长度为n的数组,问是否可以将其分为k个(k>1)mex相同的数组,如果可以的话,作出一种划分思路想法假设一个数组可以被分为k(k>2)个区间,每个区间的mex相同,那么可以确定的是,该数组中一定不存在mex这......
  • 前中后缀表达式学习笔记
    前言表达式是数学和计算机编程中常见的概念,用于表示运算和计算过程。前缀、中缀和后缀表达式都是不同的方式来表示数学表达式,它们在计算机科学和计算器设计中都有一定的应用。中缀表达式(InfixExpression):这是最常见的数学表达式表示方法,也是人们通常在书写数学公式时使用的方式......
  • 后缀表达式
    一、题目描述P8683[蓝桥杯2019省B]后缀表达式二、算法简析显然,这道题要用贪心思想。想当然的,我们会先进行降序排序,将大的相加,在减去小的。然而,这种想法是错误的。因为这道题要求的是后缀表达式的最大值,为了便于理解,我们转换为中缀表达式的最大值,这里就有了一个隐含条件—......
  • 后缀数组学习笔记 应用篇
    一些后缀数组的应用。利用\(sa\)和\(rk\)数组这类题目通常需要发掘一些性质,转化为求串的字典序最小/大后缀或长度固定的子串。P3809【模板】后缀排序后缀数组板子。P6095[JSOI2015]串分割二分答案串的排名。CF1923FShrink-Reverse转化为求长度为\(len\)的字典......
  • 后缀数组
    虽然这是基础算法,但我已经好几次忘记它怎么写了,反倒是SAM记得很牢。为了避免比赛中因这个爆蛋,我打算仔细梳理一下它的原理。问题:给你一个字符串,你需要求出\(sa_i,rk_i\),其中\(sa_i\)表示排名为\(i\)的后缀,\(rk_i\)表示后缀\(i\)的排名。首先暴力就是直接快排,里面......
  • windows server 2019/2022安装WSUS更新服务器配置System.Runtime.InteropServices.COM
    现象: 2024-02-1814:41:10Postinstallstarted2024-02-1814:41:10Detectedroleservices:Api,UI,WidDatabase,Services2024-02-1814:41:10Start:LoadSettingsFromXml2024-02-1814:41:10Start:GetConfigValuewithfilename=UpdateServices-Services.xmlit......