(这是一个线性的做法)

显然对于合法的区间,众数是唯一的,因此不妨枚举众数,将众数标记为1、其余数标记为-1,此时问题即求有多少个区间和大于0

考虑暴力的做法:从左到右枚举右端点,记当前前缀和为$tot$​​,即查询之前有多少个前缀和小于$tot$​​​

具体的,记$f_{i}$​​​为(当前)有多少个前缀和为$i$​​​​,即查询$\sum_{i=\min }^{tot-1}f_{i}$​​​,并将$f_{tot}$​​​加1​

(其中$\min$为历史前缀最小值,初始为$f_{0}=1$且$\forall i\ne 0,f_{i}=0$)

由于$tot$​​的变化是连续的,不难线性维护$\sum_{i=\min}^{tot-1}f_{i}$​​,时间复杂度为$o(n^{2})$​​

进一步的,注意到1的个数和是$o(n)$​的,-1的段数和也是$o(n)$​的,因此将连续的一段-1一起处理

具体的,考虑处理一段-1,假设这段-1之前的前缀和为$tot$​​​,这段-1的长度为$l$​​​,即查询$\sum_{i=tot-l}^{tot-1}\sum_{j=\min}^{i-1}f_{j}$​​​,并将$\forall tot-l\le i<tot,f_{i}$​​​​加1

对于修改,可以通过差分维护,并记差分数组为$\Delta f_{i}$​​(定义$f_{i}=\sum_{j=\min}^{i}\Delta f_{j}$​​​)

对于查询,不妨暴力枚举$tot$,同样利用$tot$变化的连续性,线性维护$\sum_{j=\min}^{tot}\Delta f_{j}$和$\sum_{j=\min}^{tot-1}f_{j}$​,那么不难得到查询的结果($tot$暴力枚举即代替了$i$),但时间复杂度仍为$o(n^{2})$

考虑$\min$​,显然当$tot\le \min$时之后的部分必然都为0,不妨直接变为最终的$tot-l$​(注意更新$\min$)

考虑此时的复杂度,注意到每一次$mn$减少,都会减少对应$tot$的枚举,而最终$mn$至多为所有元素和,因此$tot$的枚举级别是1的个数,也即$o(n)$的

对于单个1直接暴力"枚举"$tot$即可,显然是$o(n)$的

最终,总复杂度为$o(n)$,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1000005
4 #define ll long long
5 stack<int>st;
6 vector<int>v[N];
7 int t,n,m,x,now,mn,cnt,s,f[N<<1];
8 ll ans;
9 void update(int l,int r){
10 f[l]++,f[r+1]--;
11 st.push(l),st.push(r+1);
12 cnt++;
13 }
14 void dec(int x){
15 for(int i=0;i<x;i++){
16 if (now==mn){
17 now=mn=now-(x-i);
18 cnt=s=0;
19 return;
20 }
21 cnt-=f[now--],s-=cnt,ans+=s;
22 }
23 }
24 int main(){
25 scanf("%d",&t);
26 while (t--){
27 scanf("%d",&n);
28 m=1e6,ans=0;
29 for(int i=0;i<=m;i++)v[i].clear();
30 for(int i=1;i<=n;i++){
31 scanf("%d",&x);
32 v[x].push_back(i);
33 }
34 for(int i=0;i<=m;i++){
35 int lst=0;
36 now=mn=n,cnt=s=0;
37 update(now,now);
38 //cnt=\sum_{i=mn}^{tot}f_{i},s=\sum_{i=mn}^{tot-1}\sum_{j=mn}^{i}f_{j}
39 for(int j=0;j<v[i].size();j++){
40 if (lst+1<v[i][j]){
41 dec(v[i][j]-lst-1);
42 update(now,now+(v[i][j]-lst-1)-1);
43 }
44 s+=cnt,cnt+=f[++now],ans+=s;
45 update(now,now);
46 lst=v[i][j];
47 }
48 if (lst<n)dec(n-lst);
49 while (!st.empty()){
50 f[st.top()]=0;
51 st.pop();
52 }
53 }
54 printf("%lld\n",ans);
55 }
56 return 0;
57 }

[hdu7020]Array的更多相关文章

  1. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  2. ES5对Array增强的9个API

    为了更方便的对Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.indexOf ...

  3. JavaScript Array对象

    介绍Js的Array 数组对象. 目录 1. 介绍:介绍 Array 数组对象的说明.定义方式以及属性. 2. 实例方法:介绍 Array 对象的实例方法:concat.every.filter.fo ...

  4. 了解PHP中的Array数组和foreach

    1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组    . 2.例子:一般的数组 这里,我 ...

  5. 关于面试题 Array.indexof() 方法的实现及思考

    这是我在面试大公司时碰到的一个笔试题,当时自己云里雾里的胡写了一番,回头也曾思考过,最终没实现也就不了了之了. 昨天看到有网友说面试中也碰到过这个问题,我就重新思考了这个问题的实现方法. 对于想进大公 ...

  6. javascript之活灵活现的Array

    前言 就如同标题一样,这篇文章将会灵活的运行Array对象的一些方法来实现看上去较复杂的应用. 大家都知道Array实例有这四个方法:push.pop.shift.unshift.大家也都知道 pus ...

  7. 5.2 Array类型的方法汇总

    所有对象都具有toString(),toLocaleString(),valueOf()方法. 1.数组转化为字符串 toString(),toLocaleString() ,数组调用这些方法,则返回 ...

  8. OpenGL ES: Array Texture初体验

    [TOC] Array Texture这个东西的意思是,一个纹理对象,可以存储不止一张图片信息,就是说是是一个数组,每个元素都是一张图片.这样免了频繁地去切换当前需要bind的纹理,而且可以节省系统资 ...

  9. Merge Sorted Array

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:Yo ...

随机推荐

  1. PHP审计之POP链挖掘

    PHP审计之POP链挖掘 前言 续上文中的php反序列化,继续来看,这个POP的挖掘思路.在其中一直构思基于AST去自动化挖掘POP链,迫于开发能力有限.没有进展,随后找到了一个别的师傅已经实现好的项 ...

  2. Postman实现SHA256withRSA签名

    @ 目录 获取pmlib 引入依赖bundle.js,有以下两种方式: 使用Pre-request Script对请求进行加签(具体加签字段请看自己项目) 获取pmlib 引入依赖bundle.js, ...

  3. 灵光一闪!帮你使用Vue,搞定无法解决的“动态挂载”

    在一些特殊场景下,使用组件的时机无法确定,或者无法在Vue的template中确定要我们要使用的组件,这时就需要动态的挂载组件,或者使用运行时编译动态创建组件并挂载. 今天我们将带大家从实际项目出发, ...

  4. 【二食堂】Alpha - Scrum Meeting 5

    Scrum Meeting 5 例会时间:4.15 12:30 - 13:00 进度情况 组员 昨日进度 今日任务 李健 1. 主页搭建结束issue2. 与后端协商确定接口的设计3. 查找文本区域功 ...

  5. 2020BUAA软工个人博客作业-软件案例分析

    2020BUAA软工个人博客作业-软件案例分析 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件案例分 ...

  6. GT考试

    比较神仙的$dp+KMP+Matrix$综合题目,比较值得一写 $0x00$:首先我打了一个爆搜 不过对正解并无任何启发...(逗比发言请忽略) $0x01$:基础$dp$ 状态还是比较好设的, 考虑 ...

  7. 从0到1使用Kubernetes系列(四):搭建第一个应用程序

    传统Kubernetes应用搭建 创建Namespace 在一个Kubernetes集群中可以创建多个Namespace进行"环境隔离",当项目和人员众多的时候,可以考虑根据项目的 ...

  8. DDD领域驱动设计-项目包结构说明-Ⅳ

     基于DDD领域驱动设计的思想,在开发具体系统时,需要先建立不同的层级包.主要是梳理不同层面(应用层,领域层,基础设施层,展示层)包括的功能目录,每一个层面应该包括哪些模块.本例所讲述的分层是DDD落 ...

  9. hdu 5178 pairs(BC第一题,,方法不止一种,,我用lower_bound那种。。。)

    题意: X坐标上有n个数.JOHN想知道有多少对数满足:x[a]-x[b]<=k(题意给)[a<b] 思路: 额,,,直接看代码吧,,,, 代码: int T,n,k; int x[100 ...

  10. pku 2425 A Chess Game (SG)

    题意: 给一个由N个点组成的一张有向图,不存在环.点的编号是0~N-1. 然后给出M个棋子所在的位置(点的编号)[一个点上可同时有多个棋子]. 每人每次可移动M个棋子中的一个棋子一步,移动方向是有向边 ...