【莫队】区间众数(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…

关系代数基本运算_关系代数的基本和附加运算

关系代数基本运算Definition 定义 Every DBMS must define a query language to enable users to access the data which is stored in the database. Relational Algebra is a procedural query language. It is used to query the database tables in order to access data…

远控免杀专题 14 ---AVIator

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

面型对象 (包package)

面向对象(package关键字的概述及作用) 为什么要有包 将字节码(.class)进行分类存放 包其实就是文件夹 代码如下&#xff1a; package beyond.hjj;//在当前运行目录下创建一个子目录结构beyond\hjj&#xff0c;在子目录下存放已经编译成字节码文件的clown.class类。 class c…

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

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

asp.net treeView绑定

这个东西不是什么复杂的东西&#xff0c; 帮着小兄弟写个Demo, 实现个Binding public partial class _Default : System.Web.UI.Page{ protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Bind(); } } priv…

关于TOmcat的一些小小的知识

web.xml中的url-pattern和form 表单中的action是相同的。form 表单中的action声明的并不是servlet的名字 例&#xff1a; <servlet> <servlet-name>welcome</servlet-name> <servlet-class>WelcomeYou</servlet-class> </servlet> <ser…

Java文件类字符串getAbsolutePath()方法(带示例)

文件类字符串getAbsolutePath() (File Class String getAbsolutePath()) This method is available in package java.io.File.getAbsolutePath(). 软件包java.io.File.getAbsolutePath()中提供了此方法。 This method is used to return the absolute path of the file object …

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

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

面向对象(静态成员内部类的调用)

class beyond{public static void main(String []args){//外部类名.内部类名 对象名 外部类名.内部类对象(new 内部类名)/*Outer.Inner yy Outer.new Inner(); 类里面有个非静态方法&#xff0c;需要new创建Inner对象;正常的形式是这样的&#xff0c;但是我们习惯将new放在前…

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

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

转载: 统计图控件NetCharting 和ZedGraph的比较

原文出处&#xff1a;http://hi.baidu.com/goga/blog/item/07b3024f61b8cd35aec3ab47.html最近考察了几个统计图表控件包&#xff0c;开源的有ZedGraph&#xff0c;Nplot等&#xff0c;但是相比之下还是ZedGraph强大&#xff0c;方便一些&#xff0c;其他的感觉还是半成品。收费…

【汇编语言】状态标志符(CF/OF/SF/ZF)在运算(ADD/SUB/ADC/SBB)过程中的响应变化

目录各类运算时状态标志的响应变化标志符在各种ADD运算下的响应情况标志符在各种SUB运算下的响应情况借助标志符实现多位数之间运算ADC(add with carry)带进位加法指令SBB(subtract with borrow)带借位减法指令各类运算时状态标志的响应变化 标志符具体含义CF&#xff08;Carr…

Java集合unmodifiableSortedSet()方法(带示例)

集合类unmodifiableSortedSet()方法 (Collections Class unmodifiableSortedSet() method) unmodifiableSortedSet() method is available in java.util package. unmodifiableSortedSet()方法在java.util包中可用。 unmodifiableSortedSet() method is used to get a non-modi…

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

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

面向对象(匿名内部类在开发中的应用)

匿名内部类在开发中的应用 public class test1_NoNameInner {public static void main(String[] args) {PersonDemo yy new PersonDemo();//yy.method(new Student());yy.method(new Person() {public void show(){System.out.println("show");}});//匿名内部类当作…

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

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

【转】MFC学习总结

HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { if ((pWnd->GetDlgCtrlID() IDC_EDIT1) && (nCtlColor CTLCOLOR_EDIT)) {   COLORREF clr RGB(255,0,0);   pDC->SetTextColor(clr);  //设置红色的文本   clr RGB(0,0,0…

NHibernate初学体验进阶篇

在上篇《NHibernate初学体检记》中&#xff0c;我参照NHibernate官方快速指南写了两个示例项目&#xff0c;在示例2的源码中充斥了如下类似的代码&#xff1a;<?XML:NAMESPACE PREFIX O />Configuration cfg new Configuration(); cfg.AddAssembly("…

eclipse快捷键

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