题意

询问区间众数出现的次数

思路

唯有水题快人心

离散化+莫队

莫队一定要先加后减,有事会出错的

莫队维护区间众数:

维护两个数组,一个数组记录权值为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 大爷的字符串题的更多相关文章

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

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

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

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

  3. luogu P3709 大爷的字符串题

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

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

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

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

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

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

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

  7. 【题解】洛谷P3709大爷的字符串题

    最近想要练习一下莫队(实在是掌握的太不熟练了啊.)这题一开始看到有点懵(题面杀),后来发现是要求众数的个数.乍一看好像很难的样子. 但仔细分析一下:首先往序列当中加入一个数,这个是很简单的,只需要维护 ...

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

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

  9. 【Luogu】P3709大爷的字符串题(莫队算法)

    题目链接 语文题啊…… 看题解发现是让求区间中最多的数的个数,于是果断理解了一会题解……莫队套上完事. sum[i]表示i这个数出现的次数,cnt[i]表示出现i次的数有几个,然后乱搞搞……就好了 # ...

随机推荐

  1. 【Git 使用笔记】第三部分:多分支开发

    ###举例仓库 仓库地址A:git@gitlab.54php.cn:guowei/demos.git 仓库地址B:git@gitlab.54php.cn:infra/demos.git 开发人员仓库C ...

  2. 使用QT设计师-信号和槽signal-slot(第一弹)

    自定义信号和槽的步骤: 1.定义信号---signal1 = pyqtSignal() 2.定义槽信号---def setSlot(self): 3.连接信号和槽函数---signal1.connec ...

  3. kubernetes实战(十四):k8s持久化部署gitlab集成openLDAP登录

    1.基本概念 使用k8s安装gitlab-ce,采用GlusterFS实现持久化(注意PG使用的是NFS存储,使用动态存储重启postgresql的pod后无法成功启动pg,待解决),并集成了open ...

  4. 对nodejs的理解(一)

    1.介绍一下事件驱动编程---快餐店点餐. 在基于线程的方式中(thread-based way)你到了柜台前,把你的点餐单给收银员或者给收银员直接点餐,然后等在那直到你要的食物准备好给你.收银员不能 ...

  5. Vue 命令

    vue是数据渲染使用:axios,官网:https://www.kancloud.cn/yunye/axios/234845     ||  https://www.npmjs.com/search? ...

  6. IO操作文件的复制与删除

    import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IO ...

  7. Spark-2.0原理分析-shuffle过程

    shuffle概览 shuffle过程概览 shuffle数据流概览 shuffle数据流 shuffle工作流程 在运行job时,spark是一个stage一个stage执行的.先把任务分成stag ...

  8. Tomcat清空缓存方法

    把Tomcat的work目录下有个Catalina全部删除

  9. CNN实现垃圾邮件分类(行大小不一致要补全)

    以下是利用卷积神经网络对某一个句子的处理结构图 我们从上图可知,将一句话转化成一个矩阵.我们看到该句话有6个单词和一个标点符号,所以我们可以将该矩阵设置为7行,对于列的话每个单词可以用什么样的数值表示 ...

  10. Ember.js学习教程 -- 目录

    写在前面的话: 公司的新项目需要用到Ember.js,版本为v1.13.0.由于网上关于Ember的资料非常少,所以只有硬着头皮看官网的Guides,为了加深印象和方便以后查阅就用自己拙劣的英语水平把 ...