首页 > 其他分享 >普通莫队解决区间众数的个数

普通莫队解决区间众数的个数

时间:2022-09-21 23:34:30浏览次数:93  
标签:cnt get int 个数 -- ton 众数 莫队 mx

SP32900 KDOMINO - K-dominant array

P1997 faebdc 的烦恼

P3709 大爷的字符串题

被摩尔投票法洗脑半天,发现好像可以直接拿莫队写啊喂!

针对原数据离散化,后开一个计数器和一个存放数的数量的桶,每次添加都跟计数器取最大,每次减少都查询是否有多个众数,如果多个则最大不变,否则跟随减少。

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
int n,len,num[N],a[N],Q,ton[N],cnt[N],mx,ans[N];
int get(int x) {return x/len;}
struct node
{
	int l,r,k,id;
	bool operator < (const node &o) const {
		if(get(l) == get(o.l))
			return get(l)&1 ? r > o.r : r < o.r;
		return get(l) < get(o.l);
	}
} q[N];
void add(int x)
{
	ton[cnt[a[x]]]--; ton[++cnt[a[x]]]++;
	mx=max(mx,cnt[a[x]]);
}
void del(int x)
{
	ton[cnt[a[x]]]--;
	if(cnt[a[x]] == mx && ton[cnt[a[x]]] == 0) mx -- ;
	ton[--cnt[a[x]]]++;
}
int main()
{
	scanf("%d%d",&n,&Q); len=(int)sqrt(n)+1; 
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	memcpy(num,a,sizeof num); 
	stable_sort(num+1,num+1+n);
	int tot=unique(num+1,num+1+n)-num-1;
	for(int i=1;i<=n;i++) a[i]=lower_bound(num+1,num+1+tot,a[i])-num;
	for(int i=1;i<=Q;i++) {scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].k); q[i].id=i;}
	stable_sort(q+1,q+1+Q); int l=1,r=0;
	for(int i=1;i<=Q;i++)
	{
		int l1=q[i].l,r1=q[i].r;
		while(l < l1) del(l++);
		while(l > l1) add(--l);
		while(r < r1) add(++r);
		while(r > r1) del(r--);
		ans[q[i].id]= bool(mx*q[i].k >= (r1-l1+1));
	}
	for(int i=1;i<=Q;i++) puts(ans[i] ? "YES" : "NO");
	return 0;
}

放在这,怕我忘了 /ll

标签:cnt,get,int,个数,--,ton,众数,莫队,mx
From: https://www.cnblogs.com/EastPorridge/p/16717620.html

相关文章

  • T1046判断一个数能否同时被3和5整除 (信息学一本通C++)
     目录 [题目描述] 判断一个数n能否同时被3和5整除,如果能同时被3和5整除输出YES,否则输出NO。[输入]输入一行,包含一个整数n。( -1,000,000<n<1,000,000)[输出]......
  • 获取一个数组中的最大值和最小值三种方法
    1遍历数组int[]nums={3,1,5,2,4};intmax=nums[0];intmin=nums[0];for(inti=1;i<nums.length;i++){max=Math.max(max,nums[i]);min=Ma......
  • Swift — LeetCode — 两个数组的交集 II
    我正在参加“掘金·帆船计划”话题给你两个整数数组数字1和数字2,请将两个数组的交集作为数组返回。返回结果中每个元素的出现次数应与该元素在两个数组中出现的次数......
  • 516 筛法求约数个数
    视频链接:#include<iostream>usingnamespacestd;constintN=1000010;intp[N],vis[N],cnt;inta[N];//a[i]记录i的最小质因子的次数intd[N];//d[i]记录i......
  • JavaScript合并多个数组
    工作中经常会对数组进行合并,稍微总结一下常用的方法:concatJavaScript原生自带的函数,用法如下:letarr1=[3,5,7];letarr2=[4,78,79];letarr3=[];arr3=......
  • P7856 「EZEC-9」模糊众数 解题报告
    P7856「EZEC-9」模糊众数解题报告:题意给定一个长度为\(n\)的序列,一次操作可以将某个数字加一,多次询问一个数\(x\),求使得\(x\)称为序列众数至少要多少次操作。\(1......
  • 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数【模拟】
    题目给定一个非负整数n,请计算0到n之间的每个数字的二进制表示中1的个数,并输出一个数组。难度:简单说明:0<=n<=105题解按照题意模拟即可classSolutio......
  • 第 30 题:两个数组合并成一个数组
    请把两个数组['A1','A2','B1','B2','C1','C2','D1','D2']和['A','B','C','D'],合并为['A1','A2','A',......
  • eolinker取数组数据合并成一个数据的方法
    有时候遇到数据存在某一个数组中,类似下图结构,而用到这些数据的接口又需要一个数据集合,比如这样”[14224,14223]"。  思路是创建一个集合,把这两项数据取出来来,然后放......
  • leetcode 1385. 两个数组间的距离值
    给你两个整数数组 arr1 , arr2 和一个整数 d ,请你返回两个数组之间的 距离值 。「距离值」 定义为符合此距离要求的元素数目:对于元素 arr1[i] ,不存在任何元素 ......