最近想要练习一下莫队(实在是掌握的太不熟练了啊。)这题一开始看到有点懵(题面杀),后来发现是要求众数的个数。乍一看好像很难的样子。

  但仔细分析一下:首先往序列当中加入一个数,这个是很简单的,只需要维护一个 \(cnt[k]\) 表示 \(k\) 数字出现的次数,看看是否超过了当前维护的最大值即可。难在如何从区间中删除一个数:要注意到莫队所具有的一个独特性质即每一次的转移只在相邻的两格之间发生。这就大大的简化了问题:分成两个部分来考虑,即1.当前删去的数是众数 / 2. 当前删去的数不是众数。我们再维护一个数组 \(num[k]\) 表示在当前区间中出现了 \(k\) 次的数一共有多少个。如果删去的是众数,则查看一下是否还有别的众数,否则答案-1;不是众数,更新一下两个数组即可。

#include <bits/stdc++.h>
using namespace std;
#define maxn 400000
int n, m, k, B = , tot;
int Ans[maxn], cnt[maxn], ans;
int b[maxn], a[maxn], num[maxn];
map <int, int> Map; struct node
{
int l, r, id, bel;
node(int ll = , int rr = , int idx = ) { l = ll, r = rr, id = idx; bel = ll / B + ; }
friend bool operator <(const node& a, const node& b)
{
if(a.bel != b.bel) return a.bel < b.bel;
else return a.r < b.r;
}
}Q[maxn]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void Minus(int k)
{
if(ans == cnt[a[k]])
if(num[cnt[a[k]]] == ) ans = cnt[a[k]] - ;
num[cnt[a[k]]] --, num[-- cnt[a[k]]] ++;
} void Add(int k)
{
if(ans == cnt[a[k]]) ans = cnt[a[k]] + ;
if(cnt[a[k]] + > ans) ans = cnt[a[k]] + ;
num[cnt[a[k]]] --, num[++ cnt[a[k]]] ++;
} signed main()
{
n = read(), m = read(); B = sqrt(n);
for(int i = ; i <= n; i ++) b[i] = a[i] = read();
sort(b + , b + + n);
for(int i = ; i <= n; i ++)
if(b[i] != b[i - ] || i == ) Map[b[i]] = ++ tot;
for(int i = ; i <= n; i ++)
a[i] = Map[a[i]];
for(int i = ; i <= m; i ++)
{
int l = read(), r = read();
Q[i] = node(l, r, i);
}
sort(Q + , Q + + m);
int ll = , rr = ; ans = , cnt[a[]] = , num[] = ;
for(int i = ; i <= m; i ++)
{
if(Q[i].l <= rr)
{
while(ll < Q[i].l) Minus(ll), ll ++;
while(ll > Q[i].l) ll --, Add(ll);
while(rr > Q[i].r) Minus(rr), rr --;
while(rr < Q[i].r) rr ++, Add(rr);
}
else
{
while(rr > Q[i].r) Minus(rr), rr --;
while(rr < Q[i].r) rr ++, Add(rr);
while(ll < Q[i].l) Minus(ll), ll ++;
while(ll > Q[i].l) ll --, Add(ll);
}
Ans[Q[i].id] = ans;
}
for(int i = ; i <= m; i ++) printf("-%d\n", Ans[i]);
return ;
}

【题解】洛谷P3709大爷的字符串题的更多相关文章

  1. 洛谷P3709 大爷的字符串题(莫队)

    题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...

  2. 洛谷 P3709 大爷的字符串题

    https://www.luogu.org/problem/show?pid=3709 题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个 ...

  3. [洛谷P3709]大爷的字符串题

    题目传送门 不用管它随机什么的,就用贪心的思想去想, 会发现这道题的实质是:求查询区间众数出现次数. 莫队即可解决. 注意字符集1e9,要离散化处理. #include <bits/stdc++ ...

  4. 洛谷P3709 大爷的字符串

    题意:多次求区间众数的出现次数. 解: 这题居然可以莫队...... 首先开个桶.然后还要开个数组,cnt[i]表示出现i次的数有多少个. 然后就可以O(1)修改了. #include <cst ...

  5. luogu P3709 大爷的字符串题

    二次联通门 : luogu P3709 大爷的字符串题 /* luogu P3709 大爷的字符串题 莫队 看了半天题目 + 题解 才弄懂了要求什么... 维护两个数组 一个记录数字i出现了几次 一个 ...

  6. P3709 大爷的字符串题 (莫队)

    题目 P3709 大爷的字符串题 题意:求\([l,r]\)中众数的个数. 解析 维护两个数组: \(cnt[x]\),数\(x\)出现的次数. \(sum[x]\),出现次数为\(x\)的数的个数. ...

  7. P3709 大爷的字符串题(莫队+结论)

    题目 P3709 大爷的字符串题 做法 有一个显然的结论:一段区间里最小答案为众数的个数 用莫队来离线求众数 \(tmp_i\)表示出现\(i\)次的数的个数,\(num_i\)表示\(i\)出现的次 ...

  8. P3709 大爷的字符串题(50分)

    题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...

  9. 【luogu P3709 大爷的字符串题】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3709 离散化+区间众数..? #include <iostream> #include < ...

随机推荐

  1. 【LG1975】[国家集训队]排队

    [LG1975][国家集训队]排队 题面 洛谷 题解 又是一个偏序问题 显然\(CDQ\) 交换操作不好弄怎么办? 可以看成两次删除两次插入 排序问题要注意一下 代码 #include <ios ...

  2. InnoDB锁冲突案例演示

      Preface       As we know,InnoDB is index organized table.InnoDB engine supports row-level lock bas ...

  3. 【WXS数据类型】Array

    属性: 名称 值类型 说明 [Array].constructor [String] 返回值为“Array”,表示类型的结构字符串 [Array].length [Number] 返回数组长度 方法: ...

  4. 牛客练习赛26:D-xor序列(线性基)

    链接:牛客练习赛26:D-xor序列(线性基) 题意:小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y 题解:线性基 #inc ...

  5. lintcode204 单例

    单例   单例 是最为最常见的设计模式之一.对于任何时刻,如果某个类只存在且最多存在一个具体的实例,那么我们称这种设计模式为单例.例如,对于 class Mouse (不是动物的mouse哦),我们应 ...

  6. 【springmvc+mybatis项目实战】杰信商贸-2.数据库配置

    首先我们来了解项目的架构 我们分别使用了MySql和Oracle数据库,即是异构数据库.我们做到一个平台支持多个数据库.数据库建模我们使用Sybase公司的PowerDesigner(以后简称PD), ...

  7. Dreamweaver CS5网页制作教程

    说到Dreamweaver这个网页制作神器,不由得想起在学校里上的选修课,那是的我们只知道 table 布局,只知道构建网站最方便的是使用“所见即所得”编辑器.回忆一下,真的是很怀旧啊! 虽说咱现在大 ...

  8. JavaScript 数组操作方法 和 ES5数组拓展

    JavaScript中数组有各种操作方法,以下通过举例来说明各种方法的使用: 数组操作方法 push 在数组最后添加一个元素 var arr=[3,4,5,6] console.log(arr) // ...

  9. OpenMPI源码剖析4:rte.h 头文件的说明信息

    上一篇文章中说道,我们在 rte.h 中发现了有价值的说明: 我们一块一块来分析,首先看到第一块,关于 Process name Object: * (a) Process name objects ...

  10. Java算法2

    实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 分析:若从前向后遍历的话,那Happy后面 ...