[洛谷P5048][Ynoi2019模拟赛]Yuno loves sqrt technology III

题目大意:有$n(n\leqslant5\times10^5)$个数,$m(m\leqslant5\times10^5)$个询问,每个询问问区间$[l,r]$中众数的出现次数

题解:分块,设块大小为$S$,先可以预处理出两两块之间的众数出现次数,复杂度$O(\Big(\dfrac n S\Big)n)$。询问时先把答案设成整块内的答案,然后对两边剩下的最多$2S$个元素进行讨论。

难点在如何快速求出一个元素在区间内出现次数,先想到的是主席树,但是多了一个$\log_2$,并过不去。可以把每种数出现的位置用$vector$存下来,并且对每个数存一个它在$vector$中的位置,第$i$个数的位置是$ret_i$,假设现在的答案为$ans$,正在处理左边的多余元素,处理到第$i$个,可以看这个数值的$vector$中,第$ret_i+ans$位是否小于$r$,若小于,则这个数至少出现了$ans+1$次,更新答案。右边也是类似的。

发现$ans$最多自增$2S$次,所以一次查询的复杂度是$O(2S)$的,总复杂度为$O(2Sm+\Big(\dfrac n S\Big)n)$,当$S$略小于$\sqrt n$时最优(其实是我不怎么算)

卡点:$Ynoi$当然卡常啦

 

C++ Code:

#include <algorithm>
#include <cstdio>
#include <cctype>
#include <vector>namespace std {struct istream {
#define M (1 << 24 | 3)char buf[M], *ch = buf - 1;inline istream() {
#ifndef ONLINE_JUDGEfreopen("input.txt", "r", stdin);
#endiffread(buf, 1, M, stdin);}inline istream& operator >> (int &x) {while (isspace(*++ch));for (x = *ch & 15; isdigit(*++ch); ) x = x * 10 + (*ch & 15);return *this;}
#undef M} cin;struct ostream {
#define M (1 << 24 | 3)char buf[M], *ch = buf - 1;int w;inline ostream& operator << (int x) {if (!x) {*++ch = '0';return *this;}for (w = 1; w <= x; w *= 10);for (w /= 10; w; w /= 10) *++ch = (x / w) ^ 48, x %= w;return *this;}inline ostream& operator << (const char x) {*++ch = x; return *this;}inline ostream& operator << (const char *x) {while (*x) *this << *x++;return *this;}inline ~ostream() {
#ifndef ONLINE_JUDGEfreopen("output.txt", "w", stdout);
#endiffwrite(buf, 1, ch - buf + 1, stdout);}
#undef M} cout;
}#define maxn 500010
const int BSZ = 610, BNUM = maxn / BSZ + 10;int cnt[maxn];
int MAX[BNUM][BNUM];
int L[maxn], R[maxn], bel[maxn];int n, m, Bnum;
int w[maxn], v[maxn];std::vector<int> list[maxn];
int ret[maxn];
int main() {std::cin >> n >> m;for (int i = 1; i <= n; i++) {std::cin >> w[i];v[i] = w[i];bel[i] = (i - 1) / BSZ + 1;}const int tot = (std::sort(v + 1, v + n + 1), std::unique(v + 1, v + n + 1) - v - 1);for (int i = 1; i <= n; i++) {w[i] = std::lower_bound(v + 1, v + tot + 1, w[i]) - v;ret[i] = list[w[i]].size();list[w[i]].push_back(i);}Bnum = bel[n];for (int i = 1; i <= Bnum; i++) {L[i] = (i - 1) * BSZ, R[i] = L[i] + BSZ - 1;}L[1] = 1, R[Bnum] = n;for (int i = 1; i <= Bnum; i++) {__builtin_memset(cnt, 0, sizeof cnt);int Max = 0, now = i;for (int j = L[i]; j <= n; j++) {cnt[w[j]]++;Max = std::max(Max, cnt[w[j]]);if (j == R[now]) {MAX[i][now] = Max;now++;}}}int ans = 0;while (m --> 0) {int l, r;std::cin >> l >> r;l ^= ans, r ^= ans;const int lb = bel[l], rb = bel[r];ans = 0;if (lb == rb) {for (int i = l; i <= r; i++) {const int W = w[i], sz = list[W].size(), pos = ret[i];while (pos + ans < sz && list[W][pos + ans] <= r) ans++;}} else {if (lb + 1 < rb) ans = MAX[lb + 1][rb - 1];for (int i = l; i <= R[lb]; i++) {const int W = w[i], sz = list[W].size(), pos = ret[i];while (pos + ans < sz && list[W][pos + ans] <= r) ans++;}for (int i = L[rb]; i <= r; i++) {const int W = w[i], pos = ret[i];while (pos >= ans && list[W][pos - ans] >= l) ans++;}}std::cout << ans << '\n';}return 0;
}

  

转载于:https://www.cnblogs.com/Memory-of-winter/p/10126812.html

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

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

相关文章

C#接口实现多态

我比较喜欢对感兴趣的理论进行反复的理解甚至理解背诵下来&#xff0c;接下来再复习一下什么叫多态&#xff08;哈哈哈&#xff09; 多态&#xff1a;在同一粒度视图下对相同类型的事物不做区别的统一处理 接下来看一下接口和引擎类是如何实现多态的&#xff1a; 一、 1、创建了…

docker 网络 不好用 docker: Error response from daemon: failed to create endpoint jovial_wing on network b

启动容器时&#xff0c;有可能会遇到如下问题&#xff0c;比如启动redis容器&#xff1a; sudo docker run -d -p 6379:6379 --name redis redis:latest Linux代码docker: Error response from daemon: failed to create endpoint redis on network bridge: iptables failed: …

hadoop-hdfs-存储模型-架构模型-角色介绍

转载于:https://www.cnblogs.com/LXL616/p/10803978.html

docker 镜像 导入导出

很喜欢玩docker&#xff0c;但最新遇到一个问题&#xff0c;公司给的新机器的dns有问题&#xff0c;导致pull不下来镜像。 没办法了&#xff0c;没有镜像什么神马都干不了&#xff0c;又不能花很多时间去搭建私有的镜像库&#xff0c;只有另寻办法了。 废话少说&#xff0c;经…

使用Nginx+uWSGI部署Django项目

1.linux安装python3环境 参考链接&#xff1a;https://www.cnblogs.com/zzqit/p/10087680.html 2.安装uwsgi pip3 install uwsgiln -s /usr/local/python3/bin/uwsgi /usr/local/bin/uwsgi #建立软链接uwsgi --version #检查安装成功 3.基于uwsgidjango项目部署 django项目目…

Nagios使用check_mysql_health插件监控Mysql主机

基本信息 Nagios&#xff1a;Nagios core 4.4.3Nagios Plugins&#xff1a;check_mysql_health 2.2.2Mysql-server: 192.168.0.91db user&#xff1a;db操作流程&#xff1a;下载插件->安装插件->配置command->添加主机->添加服务安装插件 下载 wget https://labs.…

lsof使用

简介 lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下&#xff0c;任何事物都以文件的形式存在&#xff0c;通过文件不仅仅可以访问常规数据&#xff0c;还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等&#xf…

解题:2017清华集训 无限之环

题面 费用流 把每种水管再拆出来四个方向的接头&#xff0c;然后根据水管的形状连出旋转时的代价。最后黑白染色成二分图&#xff0c;然后白点对应的接头向黑点对应的接头连边&#xff0c;源点向白点自己连边&#xff0c;黑点自己向汇点连边。 怎么连边&#xff1f;我是大力讨论…

Node.js学习之(第二章:exports和module.exports)

前言 Node中&#xff0c;每个模块都有一个exports接口对象&#xff0c;我们需要把公共的方法或者字符串挂载在这个接口对象中&#xff0c;其他的模块才可以使用。 Node.js中只有模块作用域&#xff0c;默认两个模块之间的变量&#xff0c;方法互不冲突&#xff0c;互不影响&…

docker命令及挂载

常用命令所有镜像:docker images当前执行:docker ps提交保存docker容器: docker commit进入到对应服务:docker attach <container id>已经执行带容器:docker ps -l根据名称启动通过8081端口察看docker容器里的8080:docker run -i -t -d -p 8081:8080 -p23:22 ubuntu:ubun…

列表,元组,字典类的常见简单方法

一.列表&#xff08;list类&#xff09; 1.append&#xff08;&#xff09;&#xff1a;追加一个参数&#xff0c;参数可以为字符串&#xff0c;数字或列表等&#xff0c;将参数视为一个整体 2.clear&#xff08;&#xff09;&#xff1a;直接清空列表里的所有 3.count&#xf…

与图论的邂逅05:最近公共祖先LCA

什么是LCA&#xff1f; 祖先链 对于一棵树T&#xff0c;若它的根节点是r&#xff0c;对于任意一个树上的节点x&#xff0c;从r走到x的路径是唯一的(显然)&#xff0c;那么这条路径上的点都是并且只有这些点是x的祖先。这些点组成的链(或者说路径)就是x的祖先链。 LCA 根据名字来…

MAC地址进行验证的方法

需要对对应的MAC地址进行验证的方法&#xff0c;以为很简单就能过&#xff0c;鼓捣了半天以后才发现&#xff0c;我的机器是window7&#xff0c;查询出来是乱码&#xff0c;居然不给支持。没办法在网上继续找资料。终于找到了&#xff0c;贴上来&#xff0c;以备不时之需。 东西…

JAVA 分布式环境 Redis互斥锁

开始的时候项目没有添加互斥锁&#xff0c;用的依然是老的思路&#xff0c;在并发量增加的情况下&#xff0c;遇到了很多的问题&#xff0c;包括数据库重复读等&#xff0c;想了下考虑增加 互斥锁来排序对单个资源的操作。 Target(ElementType.METHOD) Retention(RetentionPoli…

相机添加多张图片css布局

<section class"feedback-upload"><aside class"photos"><div></div><div class"camera"></div></aside><aside class"tips"><div><span>选填0~4</span></div&…

移动端滑动操作学习

(function(window,document){var Slide function(box,judge,fun){if (!(this instanceof Slide)) return new Slide(box,judge,fun);var startx,starty;box.addEventListener("touchstart", function(e) {e.preventDefault(); // 阻止浏览器默认事件startx parseIn…

深入学习Oracle分区表及分区索引

关于分区表和分区索引(About Partitioned Tables and Indexes)对于10gR2而言&#xff0c;基本上可以分成几类&#xff1a; ?    Range(范围)分区 ?    Hash(哈希)分区 ?    List(列表)分区 ?    以及组合分区&#xff1a;Range-Hash,R…

跟随我在oracle学习php(21)

变量间的传值方式 总体说明&#xff1a; 1&#xff0c;这里讨论的传值方式是指&#xff1a;一个变量对另一个变量 2&#xff0c;它不仅仅适用于赋值语句&#xff0c;也适用于其他有同样含义的语句&#xff0c;比如&#xff1a;函数的实参到形参 3&#xff0c;传值方式只有2种&a…

分区索引常用命令

一般使用LOCAL索引较为方便&#xff0c;而且维护代价较低&#xff0c;并且LOCAL索引是在分区的基础上去创建索引&#xff0c;类似于在一个子表内部去创建索引&#xff0c;这样开销主要是区分分区上&#xff0c;很规范的管理起来&#xff0c;在OLAP系统中应用很广泛&#xff1b;…

面向对象简述

1&#xff0c;封装&#xff1a;将对象的属性集成在 class person:def __init__(self,name,idnum):self.namenameself.idnumidnum 2&#xff0c;继承&#xff1a;子类自动拥有父类的的封装&#xff0c;除了非私有之外 class person: def __init__(self,name,idnum): self.namena…