【莫队】区间众数(Codeforces Round #716 (Div. 2) D)

D. Cut and Stick

(赛后补题)借本题学习莫队算法以及区间众数的求法

题意:对于整型数组,每次询问[L,R][L,R][L,R]区间问最少分为多少个子序列,使得每个子序列的众数xxx的个数cntxcnt_xcntx不大于 ⌈len2⌉\left \lceil \frac{len}{2} \right \rceil2lenlenlenlen表示子序列的长度

思路:对于每次询问只需知道询问区间内的众数xxx的个数即可,最优解即为将其余的非众数尽可能与更多的xxx组合为一个子序列,而剩下的xxx每个自为一个子序列
在这里插入图片描述
给一个不严格的证明,图中有aaa个众数与bbb个非众数,法①将全部的非众数放在同一个子序列中,此时该子序列最多匹配b+1b+1b+1个众数,而剩余的众数则需单独出现;法②将b个非众数分为两部分(c+d=bc+d=bc+d=b),两部分分别匹配c+1c+1c+1d+1d+1d+1个众数(c+1+d+1=c+d+2=b+2c+1+d+1 = c+d+2 = b+2c+1+d+1=c+d+2=b+2)此时比法①多匹配了一个众数,然而由于被分为两部分,自然地也多产生了一个子序列,因此两者是等效的,可见只要将尽可能多的众数匹配给非众数,无论非众数分为多少块其效果是等效的

因此问题便转化为求区间众数的个数问题。
数组长度:nnn,询问次数:mmm
若采用暴力求解,每次询问计算众数的个数的时间复杂度为O(n)O(n)O(n),总时间复杂度为O(m∗n)O(m*n)O(mn),会超时
采用莫队算法优化,可将每次询问的平均时间复杂度降为O(n)O(\sqrt{n})O(n)

莫队步骤

  1. 将数组分为大小为n\sqrt{n}n的块
  2. 将询问顺序按下面的规则排序
    首先按照LLL所在的块号排序,块号越小越靠前(升序)
    LLL所在的块号相同,则按RRR所在的块号升序
  3. 接着定义两个函数add()add()add()del()del()del()分别用于添加和删除元素,用于在上一个询问的区间基础上增删元素得到当前询问的区间,每次调用增删函数的关键是动态地更新众数的状态

维护众数状态
采用mapmapmap映射存储每个数出现的次数,采用数组aaa记录有多少个数出现了iii次,当前的众数的个数即为数组a[i]>0a[i]>0a[i]>0的最大的iii,每次增删实时更新两者的数据即可

#include<bits/stdc++.h>
#define debug1(x) cout<<#x<<":"<<x<<endl
#define fastio() ios_base::sync_with_stdio(0);cin.tie(0)
typedef long long ll;
typedef unsigned long long ull;
const int N = (int)3e5+100;
const int RN = sqrt(N)+10;
const int MOD = 10000;
using namespace std;
int a[N];
map<int,int> mp[RN];
int n,m,block;
int cnt[N],sum[N],ans[N],max_cnt = 0;
struct query
{int id;int l;int r;
}q[N];bool cmp(query a, query b)
{int al = a.l / block, bl = b.l / block;int ar = a.r / block, br = b.r / block;if(al != bl) return al < bl;return ar < br;
}void add(int e)
{sum[cnt[e]]--;cnt[e]++;sum[cnt[e]]++;max_cnt = max(max_cnt, cnt[e]);
}void del(int e)
{sum[cnt[e]]--;if(cnt[e] == max_cnt && sum[cnt[e]] == 0) max_cnt--;cnt[e]--;sum[cnt[e]]++;
}int main()
{cin>>n>>m;block = sqrt(n);for(int i = 1; i <= n; i++) scanf("%d",&a[i]);int l, r;for(int i = 0; i < m; i++){scanf("%d%d",&l,&r);q[i].id = i;q[i].l = l;q[i].r = r;}sort(q, q + m, cmp);int cl, cr, width;cl = cr = 0; add(a[0]);for(int i = 0; i < m; i++){l = q[i].l, r = q[i].r;while(cr < r) add(a[++cr]);while(cl > l) add(a[--cl]);while(cr > r) del(a[cr--]);while(cl < l) del(a[cl++]);width = r - l + 1;ans[q[i].id] = max(2 * max_cnt - width, 1);}for(int i = 0; i < m; i++) printf("%d\n", ans[i]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何正确使用SqlConnection

以前曾见过有人这样写代码&#xff1a; public class Service1 : IService1{private SqlConnection conn new SqlConnection();public void Method1(){//do something with conn;}public void Method2(){//do something with conn;}public void Method3(){//do something with…

远控免杀专题 14 ---AVIator

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

【Web开发】级联查询(Ajax/ jQuery/ Servlet)

实现级联查询 共有两个下拉框&#xff0c;第一级为学院&#xff0c;第二级为学院开设的科目。 实现的功能为&#xff1a;当改变学院的选择&#xff0c;第二级下拉框需变为对应学院开设的科目内容。 结果预览&#xff1a; jsp页面 <% page contentType"text/html;…

远控免杀专题(15)-DKMC免杀

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

SQL——以面向集合的思维方式来思考

本文来自&#xff1a;http://www.ituring.com.cn/article/details/472 为了以有趣的方式更好地帮助你形成面向集合的思维方式&#xff0c;我将给出自己最喜欢的游戏之一——集合。你可以在线玩这个游戏&#xff0c;网址是www.setgame.com/puzzle/set.htm&#xff0c;每天都会贴…

远控免杀专题(16)-Unicorn免杀

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

【汇编语言】乘法(MUL/IMUL)

乘法&#xff08;MUL/IMUL&#xff09; 目录乘法&#xff08;MUL/IMUL&#xff09;IMUL(signed multiply)有符号数乘法MUL(unsigned multiply)无符号数乘法麻&#xff01;属实是被这个有符号乘法给整麻了&#xff0c;教材就一行例子直接不解释了&#xff0c;关于标志位溢出的一…

eclipse快捷键

Java开发工具(Eclipse的视窗和视图概述) A:视窗 每一个基本的窗体被称为视窗 PackageExplorer 显示项目结构&#xff0c;包&#xff0c;类&#xff0c;及资源Outline 显示类的结构&#xff0c;方便查找&#xff0c;识别&#xff0c;修改Console 程序运行的结果在该窗口显示Hie…

【汇编语言】除法(DIV/IDIV)

除法&#xff08;DIV/IDIV&#xff09; 目录除法&#xff08;DIV/IDIV&#xff09;DIV(unsigned divide)无符号数除法IDIV(signed divide)有符号数除法DIV(unsigned divide)无符号数除法 格式&#xff1a;DIV SRC 操作&#xff1a; SRCSRCSRC为字节时&#xff0c;(AL)←(AX)/…

远控免杀专题(17)-Python-Rootkit免杀

免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家桶…

斜视角的讨论(转)

http://school.ogdev.net/listshow.asp?page4&typeid0&categoryid5&id0&ListType2 目 录 1.1 地图和地表 1.2 斜视角游戏中的视角 1.3 Tile图片的拼接 1.4 不同地表间的过渡 1.5 地图数据结构的定义 --------------------------------------------------…

计算机网络(湖科大教书匠)

计算机网络&#xff08;湖科大教书匠&#xff09; 本文档为教学视频【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;_哔哩哔哩_bilibili】的摘录 目录计算机网络&#xff08;湖科大教书匠&#xff09;一、绪论1.2 因特网概述1.2.1 网络、互连网&#xff08;互联…

远控免杀专题(18)-ASWCrypter免杀

免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家桶…

Direct3D中的绘制(3)

立方体——只比三角形稍微复杂一点&#xff0c;这个程序渲染一个线框立方体。 这个简单的绘制和渲染立方体的程序的运行结果如下图所示&#xff1a; 源程序&#xff1a; /************************************************************************************** Renders a …

远控免杀专题(19)-nps_payload免杀

免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全家桶…

操作系统中的多级队列调度

多级队列调度 (Multilevel queue scheduling) Every algorithm supports a different class of process but in a generalized system, some process wants to be scheduled using a priority algorithm. While some process wants to remain in the system (interactive proce…

借助格式化输出过canary保护

0x01 canary保护机制 栈溢出保护是一种缓冲区溢出攻击缓解手段&#xff0c;当函数存在缓冲区溢出攻击漏洞时&#xff0c;攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后&#xff0c;函数开始执行的时候会先往栈里插入cookie信息&#xff0c;当函数真…

各抓包软件的之间差异_系统软件和应用程序软件之间的差异

各抓包软件的之间差异什么是软件&#xff1f; (What is Software?) Software is referred to as a set of programs that are designed to perform a well-defined function. A program is a particular sequence of instructions written to solve a particular problem. 软件…

ret2shellcdoe

ret2shellcode的关键是找到一个缓冲区&#xff0c;这个缓冲区是可读写写可执行的&#xff0c;我们要想办法把我们的shellcdoe放到这个缓冲区&#xff0c;然后跳转到我们的shellcode处执行。 例子&#xff1a; #include <stdio.h> #include <string.h> char str1[…

远控免杀专题(20)-GreatSCT免杀

转载&#xff1a;https://mp.weixin.qq.com/s/s9DFRIgpvpE-_MneO0B_FQ 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/mete…