首页 > 其他分享 >CF121E Lucky Array

CF121E Lucky Array

时间:2023-11-13 15:36:48浏览次数:48  
标签:right dfrac CF121E Lucky tag mathcal Array 复杂度 left

sqrt technology, sqrt faith.

洛谷 CF

  • 定义一个数为幸运数字,当且仅当其十进制数位中仅有 \(4\) 和 \(7\) 组成。

  • 给出长度为 \(n\) 的序列 \(p_1\sim p_n\),有 \(q\) 次操作,分为两种类型:

    • \(\texttt{add }l\texttt{ }r\texttt{ }x\),将 \(p_l\sim p_r\) 加上 \(x\)。

    • \(\texttt{count }l\texttt{ }r\),查询当前 \(p_l\sim p_r\) 中有多少个幸运数字。

  • \(n,q\le 10^5\)。设 \(V\) 为序列 \(p\) 的值域,保证任意时刻 \(\boldsymbol{|V|\le 10^4}\)

  • \(4.00\,\text{ms}\,/\,250.00\,\text{MB}\)。

tags:

  • \(\text{data structures}\)

  • \(\color{red}*2400\)

首先,任意时刻 \(|V|\le 10^4\) 意味着整个问题只会涉及四位及以下的幸运数字。

考虑计算每一位的幸运数字有多少个,每位可以选 \(4\) 或 \(7\),可以计算出这个范围内的幸运数字总数 \(k=2+2^2+2^3+2^4=30\)。

发现 \(k\) 很小,肯定有用,考虑先把所有幸运数字存放到一个容器里。因为叫“幸运数字”,所以代码中存放的容器名称使用了 maze 的名字首拼缩写。

考虑序列分块,设块长为 \(B\)。记 \(i\) 所在块为 \(bel_i\),第 \(i\) 块的范围为 \([bl_i,br_i]\)。

对于每个块,维护加标记 \(tag_i\)。再维护一个数组 \(a_i\),其值为使得 \(\boldsymbol{x+tag_{bel_i}}\) 等于当前 \(\boldsymbol{p_i}\) 的数 \(\boldsymbol{x}\)。简单来说就是任意时刻 \(a_i+tag_{bel_i}=p_i\)。对于整块再维护桶 \(cnt_{i,j}\) 表示块 \(i\) 内有多少个位置的 \(\boldsymbol{a}\) 为 \(j\) 。

修改的时候整块标记修改,散块 \(a\) 数组修改,维护好 \(a_i+tag_{bel_i}=p_i\)。

查询的时候,散块暴力遍历判断每个位置的真实值是否是幸运数字。整块则枚举 \(k\) 个幸运数字 \(y\),若当前块 \(i\) 内有一个位置 \(j\) 满足 \(p_j=y\),则 \(a_j=y-tag_i\)。即查询块内有多少个位置的 \(a\) 值等于 \(y-tag_i\),贡献为 \(cnt_{i,y-tag_i}\)。

接下来分析时间复杂度。因为空间复杂度显然为 \(\mathcal{O}\left(n+\dfrac{n|V|}{B}\right)\)。

  • 单次修改:

    整块 \(\mathcal{O}\left(\dfrac{n}{B}\right)\) 个,单个修改的时间复杂度为 \(\mathcal{O}(1)\);散块 \(\mathcal{O}(1)\) 个,单个修改的时间复杂度为 \(\mathcal{O}(B)\)。总时间复杂度为 \(\mathcal{O}\left(\dfrac{n}{B}+B\right)\)。

  • 单次查询:

    整块 \(\mathcal{O}\left(\dfrac{n}{B}\right)\) 个,单个查询的时间复杂度为 \(\mathcal{O}(k)\);散块 \(\mathcal{O}(1)\) 个,单个查询的时间复杂度为 \(\mathcal{O}(B)\)。总时间复杂度为 \(\mathcal{O}\left(\dfrac{nk}{B}+B\right)\)。

综上,该算法的时间复杂度为 \(\mathcal{O}\left(n+q\left( \dfrac{nk}{B}+B \right)\right)\)。

取 \(B=\mathcal{O}\left(\sqrt{nk}\right)\) 时,时间复杂度为 \(\mathcal{O}\left(n+q\sqrt{nk}\right)\),空间复杂度为 \(\mathcal{O}\left(n+|V|\cdot \sqrt{\dfrac{n}{k}}\right)\)。可以接受。

提交记录(\(\color{limegreen}\bf{Accepted}\) \(\boldsymbol{780\, \text{ms}\,/\,3.46\,\text{MB}}\),含代码)

标签:right,dfrac,CF121E,Lucky,tag,mathcal,Array,复杂度,left
From: https://www.cnblogs.com/MnZnOIerLzy/p/17829247.html

相关文章

  • [V8] Object & array copying
    import{createBenchmark}from"./benchmark";classMyArrayextendsArray{}constSIZE=100;constobj:Record<string,number>={};/***{*_0:0,*_1:1,*_2:2,*...*}*/constarray=[];/***[*'_0&......
  • 【刷题笔记】108. Convert Sorted Array to Binary Search Tree
    题目Givenanarraywhereelementsaresortedinascendingorder,convertittoaheightbalancedBST.Forthisproblem,aheight-balancedbinarytreeisdefinedasabinarytreeinwhichthedepthofthetwosubtreesof every nodeneverdifferbymorethan......
  • Java 集合—ArrayList
    ArrayList介绍ArrayList 的底层是数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。ArrayList类位于java.util包中,使用前需要引入它,语法格式如下:importjava.util.ArrayList;//引入ArrayList类ArrayList<E>objectName=newArrayList<>();//初始化......
  • java ArrayList的基本使用
    packagecom.elaina.test1;importjava.util.ArrayList;publicclasstest1{publicstaticvoidmain(String[]args){//1.创建集合的对象//泛型:限定集合中的存储数据的类型//ArrayList<String>list=newArrayList<String>();......
  • C. Serval and Toxel's Arrays 组合数学
    题目链接......
  • 以下哪些Array对象的方法不会更改原有数组?
    以下哪些Array对象的方法不会更改原有数组?Aconcat()Bsplice()Cmap()Dsort()正确答案:AC会改变数组的方法:push()pop()shift()unshift()splice()sort()reverse()forEach()不会改变数组的方法:filter()concat()slice()map()concat函数连接多个array,不改变原arr......
  • "+new Array(017)" 这段代码输出为 NaN
    首先,前面+是一元运算符,相当于我们说的正负,无运算效果,但是可以将字符串等转为number类型。此题中017其实是八进制,故而是是Array(15)。这里相当于对于一个未赋值但是长度为15的数组进行number类型转化,其结果为NaN八进制的17转为二进制:001111,再转为十进制的15(8+4+2+1)+运算符......
  • ArrayList
    ArrayList的底层是动态数组,它的容量能动态增长。索引存取元素,有序,可重复,允许多个null1、ArrayList初始容量privatestaticfinalObject[]DEFAULTCAPACITY_EMPTY_ELEMENTDATA={};privatestaticfinalObject[]EMPTY_ELEMENTDATA={};transientObject[]elementData;......
  • Lucky Array
    数据结构抽象题法一:总共加\(O(10^9)\)次,我们常数超小的树状数组可以直接拿下!!!(时限4.0s)法二:答案不多,值域不大,我们分块,块记录数出现的次数,然后用tag维护一下增量,注意cnt里的东西和tag没关系,查询才要用到tag。时间复杂度\(O(30N\sqrt{N}=10^9)\),看似没优化,但是实际上当\(d<0\)时......
  • 线程安全集合(JDK1.5之前和之后)、CopyOnWriteArrayList、CopyOnWriteArraySet
    JDK1.5之前JDK1.5之前:Collections.synchronizedList JDK1.5之后CopyOnWriteArrayList   CopyOnWriteArraySet    ......