【题解】洛谷P3709大爷的字符串题
最近想要练习一下莫队(实在是掌握的太不熟练了啊。)这题一开始看到有点懵(题面杀),后来发现是要求众数的个数。乍一看好像很难的样子。
但仔细分析一下:首先往序列当中加入一个数,这个是很简单的,只需要维护一个 \(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大爷的字符串题的更多相关文章
- 洛谷P3709 大爷的字符串题(莫队)
题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...
- 洛谷 P3709 大爷的字符串题
https://www.luogu.org/problem/show?pid=3709 题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个 ...
- [洛谷P3709]大爷的字符串题
题目传送门 不用管它随机什么的,就用贪心的思想去想, 会发现这道题的实质是:求查询区间众数出现次数. 莫队即可解决. 注意字符集1e9,要离散化处理. #include <bits/stdc++ ...
- 洛谷P3709 大爷的字符串
题意:多次求区间众数的出现次数. 解: 这题居然可以莫队...... 首先开个桶.然后还要开个数组,cnt[i]表示出现i次的数有多少个. 然后就可以O(1)修改了. #include <cst ...
- luogu P3709 大爷的字符串题
二次联通门 : luogu P3709 大爷的字符串题 /* luogu P3709 大爷的字符串题 莫队 看了半天题目 + 题解 才弄懂了要求什么... 维护两个数组 一个记录数字i出现了几次 一个 ...
- P3709 大爷的字符串题 (莫队)
题目 P3709 大爷的字符串题 题意:求\([l,r]\)中众数的个数. 解析 维护两个数组: \(cnt[x]\),数\(x\)出现的次数. \(sum[x]\),出现次数为\(x\)的数的个数. ...
- P3709 大爷的字符串题(莫队+结论)
题目 P3709 大爷的字符串题 做法 有一个显然的结论:一段区间里最小答案为众数的个数 用莫队来离线求众数 \(tmp_i\)表示出现\(i\)次的数的个数,\(num_i\)表示\(i\)出现的次 ...
- P3709 大爷的字符串题(50分)
题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...
- 【luogu P3709 大爷的字符串题】 题解
题目链接:https://www.luogu.org/problemnew/show/P3709 离散化+区间众数..? #include <iostream> #include < ...
随机推荐
- OpenCV 3.2 Tracking 物体跟踪
跟踪就是在连续视频帧中定位物体,通常的跟踪算法包括以下几类: 1. Dense Optical Flow 稠密光流 2. Sparse Optical Flow 稀疏光流 最典型的如KLT算法(Kan ...
- RTL8188EUS之MAC地址烧写(使用利尔达模组)
1. 手上有几个RTL8188EUS的wifi模块,打算把台式机装个无线网卡,但是插上之后发现没有MAC,没办法只能自己去找个烧写MAC的软件.RTL8188内部有个eFuse,用来配置之类的.这个e ...
- MyBatis-SpringMVC整合
1.添加spring相关jar包 2.配置ehcache jar包. 3.添加ehcache mybatis 适配器jar包(在mybatis官网) 4.添加spring mybatis 适配器jar ...
- Ubuntu 14.04 登录 界面添加 root账号
1打开终端输入:sudo gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 2在弹出的编辑框里加入:greeter-show-manual- ...
- 使用python中读取配置文件
最近在接触利用python来写测试框架,本人也是个刚接触python,所以是个小菜鸟,今天开始,一点点的记录学习中的积累,方便以后的学习以及回顾,也希望能帮助跟我一样的小菜鸟们一步步的成长起来.那么, ...
- 【Linux 运维】Centos7初始化网络配置
设置网络 (1)动态获取一个IP地址 #dhclient 系统自动自动获取一个IP地址#ip addr 查看获取的ip地址(2)查看网关,子网掩码 虚拟机编辑>虚拟 ...
- Period :KMP
I - Period Problem Description For each prefix of a given string S with N characters (each character ...
- Leetcode - 557. Reverse Words in a String III (C++) stringstream
1. 题目:https://leetcode.com/problems/reverse-words-in-a-string-iii/discuss/ 反转字符串中的所有单词. 2. 思路: 这题主要是 ...
- win7 个人电脑 IIS7服务器(web服务器) 同一局域网下均可访问本机网页
建立web服务器: 1.控制面板-->程序-->打开或关闭windows功能-->internet信息服务全部打钩,确定即可. 访问网页: 1.C:\inetpub\wwwroot\ ...
- c#基类继承
[ 塔 · 第 三 条 约 定 ] 编写一个多边形作为基类(成员:定点数)抽象方法(子类实现):体积.边长 正三角形类:成员 边长 长方形类:成员 长宽 using System; using Sys ...