P3709 大爷的字符串题
题意
询问区间众数出现的次数
思路
唯有水题快人心
离散化+莫队
莫队一定要先加后减,有事会出错的
莫队维护区间众数:
维护两个数组,一个数组记录权值为x的出现次数,一个记录出现次数为x的数的个数
add很简单,更新ans
delete的时候,删除的是ans话,查看出现次数为x的个数是否为1,是就ans--(这里删除后至少为ans--),不是就和ans无关
代码
#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int maxn=200007;
int a[maxn],b[maxn],n,m;
int ans,belong[maxn],vis[maxn],num[maxn];
struct node {
int s,t,id;
int ans;
bool operator < (const node &b) const {
return belong[s]==belong[b.s] ? t<b.t : s<b.s ;
}
}Q[maxn];
bool cmp(node a,node b)
{
return a.id<b.id;
}
void add(int x)
{
num[vis[x]]--;
vis[x]++;
if(ans<vis[x]) ans++;
num[vis[x]]++;
}
void delet(int x)
{
if(ans==vis[x] && num[vis[x]]==1) ans--;
num[vis[x]]--;
vis[x]--;
num[vis[x]]++;
}
int main()
{
scanf("%d%d",&n,&m);
int k=sqrt(n);
FOR(i,1,n) scanf("%d",&a[i]),b[i]=a[i];
sort(b+1,b+1+n);
FOR(i,1,n) a[i]=lower_bound(b+1,b+1+n,a[i])-b;
FOR(i,1,n) belong[i]=(i-1)/k+1;
FOR(i,1,m) scanf("%d%d",&Q[i].s,&Q[i].t),Q[i].id=i;
sort(Q+1,Q+1+m);
int l=1,r=0;
FOR(i,1,m)
{
while(l > Q[i].s) add(a[--l]);
while(l < Q[i].s) delet(a[l++]);
while(r < Q[i].t) add(a[++r]);
while(r > Q[i].t) delet(a[r--]);
Q[i].ans=max(ans,0);
}
sort(Q+1,Q+1+m,cmp);
FOR(i,1,m) printf("%d\n",-Q[i].ans);
return 0;
}
P3709 大爷的字符串题的更多相关文章
- P3709 大爷的字符串题 (莫队)
题目 P3709 大爷的字符串题 题意:求\([l,r]\)中众数的个数. 解析 维护两个数组: \(cnt[x]\),数\(x\)出现的次数. \(sum[x]\),出现次数为\(x\)的数的个数. ...
- P3709 大爷的字符串题(莫队+结论)
题目 P3709 大爷的字符串题 做法 有一个显然的结论:一段区间里最小答案为众数的个数 用莫队来离线求众数 \(tmp_i\)表示出现\(i\)次的数的个数,\(num_i\)表示\(i\)出现的次 ...
- luogu P3709 大爷的字符串题
二次联通门 : luogu P3709 大爷的字符串题 /* luogu P3709 大爷的字符串题 莫队 看了半天题目 + 题解 才弄懂了要求什么... 维护两个数组 一个记录数字i出现了几次 一个 ...
- 洛谷 P3709 大爷的字符串题
https://www.luogu.org/problem/show?pid=3709 题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个 ...
- 洛谷P3709 大爷的字符串题(莫队)
题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...
- P3709 大爷的字符串题(50分)
题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...
- 【题解】洛谷P3709大爷的字符串题
最近想要练习一下莫队(实在是掌握的太不熟练了啊.)这题一开始看到有点懵(题面杀),后来发现是要求众数的个数.乍一看好像很难的样子. 但仔细分析一下:首先往序列当中加入一个数,这个是很简单的,只需要维护 ...
- 【luogu P3709 大爷的字符串题】 题解
题目链接:https://www.luogu.org/problemnew/show/P3709 离散化+区间众数..? #include <iostream> #include < ...
- 【Luogu】P3709大爷的字符串题(莫队算法)
题目链接 语文题啊…… 看题解发现是让求区间中最多的数的个数,于是果断理解了一会题解……莫队套上完事. sum[i]表示i这个数出现的次数,cnt[i]表示出现i次的数有几个,然后乱搞搞……就好了 # ...
随机推荐
- Vue源码学习1——Vue构造函数
Vue源码学习1--Vue构造函数 这是我第一次正式阅读大型框架源码,刚开始的时候完全不知道该如何入手.Vue源码clone下来之后这么多文件夹,Vue的这么多方法和概念都在哪,完全没有头绪.现在也只 ...
- Mybatis插入数据后返回主键id
有时候使用mybatis插入数据后,需要用到记录在数据库中的自增id,可以利用keyProperty来返回,赋值给实体类中的指定字段. 单条记录插入并返回 First, if your databas ...
- 新建虚拟机_XP系统(二)
准备工作:按照<新建虚拟机_XP系统(一)>中操作步骤创建好虚拟机 1.启动虚拟机进入如下界面.新建分区.选择[6]运行DiskGenius工具 2.选择快速分区.可以自定义 3.新建分区 ...
- C++三大特性之继承
原文地址:https://qunxinghu.github.io/2016/09/12/C++%20%E4%B8%89%E5%A4%A7%E7%89%B9%E6%80%A7%E4%B9%8B%E7%B ...
- linux下ssh远程登录/scp远程复制文件/rsync远程同步命令的自动登录
最近需要写一个脚本备份各个服务器上的程序到一个指定服务器上,本来以为查查rsync命令的使用321就能搞定,结果rsync命令要支持自动登 录还是要配置服务和参数,又不确定网上说的配置的行不行,因为都 ...
- string、const char*、 char* 、char[]相互转换(待整理)
string.const char*. char* .char[]相互转换(全) https://blog.csdn.net/rongrongyaofeiqi/article/details/5244 ...
- word自动导入目录
1:如果在编写word时,有给各章添加标题,可以使用word的目录生成功能,如图:
- 跟我学Makefile(七)
定义模式规则 使用模式规则来定义一个隐含规则.一个模式规则就好像一个一般的规则,只是在规则中,目标的定义需要有“%”字符.“%”的意思是表示一个或多个任意字符.在依赖目标中同样可以使用“%”,只是依赖 ...
- (转)ElasticSearch Java Api-检索索引库
上篇博客记录了如何用java调用api把数据写入索引,这次记录下如何搜索. 一.准备数据 String data1 = JsonUtil.model2Json(new Blog(1, "gi ...
- 蒙特卡洛模拟(Monte Carlo simulation)
1.蒙特卡罗模拟简介 蒙特卡罗模拟,也叫统计模拟,这个术语是二战时期美国物理学家Metropolis执行曼哈顿计划的过程中提出来的,其基本思想很早以前就被人们所发现和利用.早在17世纪,人们就知道用事 ...