bzoj2724 [Violet 6]蒲公英 分块

2023-11-23 17:50

本文主要是介绍bzoj2724 [Violet 6]蒲公英 分块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description


求区间众数,强制在线

Code


一开始yy了一个分块线段树合并的sb做法。。

如果不强制在线的话可以回滚莫队,强制在线考虑分块暴力
先离散。分块中常用的技巧是对块做各种前缀和。本题我们记s[i,j]表示前i块j出现的次数,记r[i,j]为i到j块的答案
对于询问[l,r],我们把在两侧零散出现的数字在中间整块中出现的次数塞进桶里(绕
在这里插入图片描述
看图,我们把红色部分出现的数字在蓝色部分中出现的次数塞进一个桶里面,显然只有红色部分的数字出现次数会发生变化
这样我们就可以在修改的时候顺便求答案了
一开始非常sb地把离散的序号输出了gg

Code


#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define rep(i,st,ed) for (register int i=st;i<=ed;++i)
#define fill(x,t) memset(x,t,sizeof(x))const int N=40005;int bel[N],st[N],ed[N],a[N];
int cnt[205][N],rec[205][205],b[N];
int wjp[N];int read() {int x=0,v=1; char ch=getchar();for (;ch<'0'||ch>'9';v=(ch=='-')?(-1):(v),ch=getchar());for (;ch<='9'&&ch>='0';x=x*10+ch-'0',ch=getchar());return x*v;
}int main(void) {int n=read(),m=read();int B=sqrt(n);rep(i,1,n) {a[i]=b[i]=read();bel[i]=(i-1)/B+1;if (!st[bel[i]]) st[bel[i]]=i;ed[bel[i]]=i;}std:: sort(b+1,b+n+1);int size=std:: unique(b+1,b+n+1)-b-1;rep(i,1,n) a[i]=std:: lower_bound(b+1,b+size+1,a[i])-b;rep(i,1,bel[n]) {rep(j,st[i],ed[i]) cnt[i][a[j]]++;rep(j,1,n) cnt[i][j]+=cnt[i-1][j];}rep(i,1,bel[n]) {rep(k,st[i],ed[i]) {if (cnt[i][a[k]]-cnt[i-1][a[k]]>cnt[i][rec[i][i]]-cnt[i-1][rec[i][i]]) {rec[i][i]=a[k];} else if (cnt[i][a[k]]-cnt[i-1][a[k]]==cnt[i][rec[i][i]]-cnt[i-1][rec[i][i]]&&a[k]<rec[i][i]) {rec[i][i]=a[k];}}rep(j,i+1,bel[n]) {rec[i][j]=rec[i][j-1];rep(k,st[j],ed[j]) {if (cnt[j][a[k]]-cnt[i-1][a[k]]>cnt[j][rec[i][j]]-cnt[i-1][rec[i][j]]) {rec[i][j]=a[k];} else if (cnt[j][a[k]]-cnt[i-1][a[k]]==cnt[j][rec[i][j]]-cnt[i-1][rec[i][j]]&&a[k]<rec[i][j]) {rec[i][j]=a[k];}}}}for (int lastans=0;m--;) {int x=read(),y=read();int l=(x+lastans-1)%n+1,r=(y+lastans-1)%n+1;if (r<l) std:: swap(l,r);lastans=0;int bl=bel[l],br=bel[r];if (br-bl<=1) {rep(i,l,r) {++wjp[a[i]];if (wjp[a[i]]>wjp[lastans]) lastans=a[i];else if (wjp[a[i]]==wjp[lastans]&&a[i]<lastans) lastans=a[i];}rep(i,l,r) wjp[a[i]]=0;lastans=b[lastans];printf("%d\n", lastans);} else {rep(i,l,ed[bl]) wjp[a[i]]=cnt[br-1][a[i]]-cnt[bl][a[i]];rep(i,st[br],r) wjp[a[i]]=cnt[br-1][a[i]]-cnt[bl][a[i]];lastans=rec[bl+1][br-1];wjp[lastans]=cnt[br-1][lastans]-cnt[bl][lastans];rep(i,l,ed[bl]) {++wjp[a[i]];if (wjp[a[i]]>wjp[lastans]) lastans=a[i];else if (wjp[a[i]]==wjp[lastans]&&a[i]<lastans) lastans=a[i];}rep(i,st[br],r) {++wjp[a[i]];if (wjp[a[i]]>wjp[lastans]) lastans=a[i];else if (wjp[a[i]]==wjp[lastans]&&a[i]<lastans) lastans=a[i];}lastans=b[lastans];printf("%d\n", lastans);rep(i,l,ed[bl]) wjp[a[i]]=0;rep(i,st[br],r) wjp[a[i]]=0;wjp[rec[bl+1][br-1]]=0;}}return 0;
}

这篇关于bzoj2724 [Violet 6]蒲公英 分块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/419699

相关文章

贝锐蒲公英远程视频监控方案:4G入网无需公网IP,跨品牌统一管理

在部署视频监控并实现集中监看时,常常会遇到各种挑战。比如:部分监控点位布线困难、无法接入有线宽带,或是没有固定公网IP,难以实现远程集中监看;已有网络质量差,传输延迟大、丢包率高,远程实时查看监控容易导致画面卡顿、丢帧,影响监看效果;一些监控区域已经有设备,不同品牌、不同设备之间缺乏统一标准和平台,无法快速实现远程统一管理、集中监看。 面对上述问题,如果替换现有网络,申请运营商专线不仅价格高

Spring Boot实现大文件分块上传

1.分块上传使用场景 大文件加速上传:当文件大小超过100MB时,使用分片上传可实现并行上传多个Part以加快上传速度。 网络环境较差:网络环境较差时,建议使用分片上传。当出现上传失败的时候,您仅需重传失败的Part。 文件大小不确定: 可以在需要上传的文件大小还不确定的情况下开始上传,这种场景在视频监控等行业应用中比较常见。 2.实现原理 实现原理其实很简单,核心就是客户端把大文件

【BNU】40719 Arithmetic Progressions【分块+FFT】

传送门:【BNU】40719 Arithmetic Progressions 题目分析: 用分块+FFT强行AC了这题…… 之前一直TLE……然后改了好久把姿势改的优美点了……终于过了…… 大概思路是:我们考虑分块,假设每一块的大小为S,一共分了B块然后我们分两种情况讨论: 1.第二个数在第i块,第一个数在(1~i-1)块内,第三个数在(i+1~B)块内。 2.至少两个数在同一块内。

【HDU】5213 Lucky 【分块(在线算法)】

传送门:【HDU】5213 Lucky 题目分析: 我来说一下这题的在线做法。 首先我们将区间分成 n√ \sqrt n块,用f[x][y]表示第x块的数和第y块的数相加等于K的对数,这个可以 O(nn√) O(n \sqrt n)的预处理。然后还有g[x][y]表示在第1~x块中有的大小为y的数的个数,这个的复杂度同样 O(nn√) O(n \sqrt n)。 接下来,对于每组询问,我们

针对大数据的种子点生长——分块生长的策略

前言   在之前的种子点生长系列中,探讨了使用三种提取图像中内容部分种子点生长算法,分别是泛洪法、扫描线法和区段法。我们知道这三种算法在空间上都需要占用三维图像的空间以及相应的位图标记表的空间。有时,我们需要处理一些体积相当大的数据,这些数据都是内存中无法放下的,如数十数百GB的数据,想要获得其中图像内容信息,一般需要对图像进行分块生长。   本文使用一种比较直接的思路对数据进行分块,然

P3313 [SDOI2014] 旅行(分块做法)

~~~~~      P3313 [SDOI2014] 旅行 ~~~~~      总题单链接 思路 ~~~~~      遇到这种树上路径问题,就考虑用重链剖分转为区间问题。 ~~~~~      问题转换为了:给定一个区间和 k k k,求这个区间内信仰为 k k k 的城市的 权值和 或 最大权值。 ~~~~~      这个问题也可以用动态开点线段树解决(现在不会,以后

学习笔记 ---- 数论分块(整除分块)

文章目录 算法概述引理引理 1 1 1引理 2 2 2 数论分块结论(区间右端点公式)过程 N N N 维数论分块向上取整的数论分块 例题 H ( n ) H(n) H(n)[CQOI2007] 余数求和[清华集训2012] 模积和 算法 概述 数论分块可以快速计算一些含有除法向下取整的和式(即形如 ∑ i = 1 n f ( i ) g ( ⌊ n i ⌋ ) \sum

C/C++网络编程--文件分块传输

文件分块传输是网络编程中一个常见的任务,尤其是在处理大文件时,将文件分块可以提高传输效率,简化错误处理,并可以实现并发传输。下面,写个从客户端向服务器发送大型数据的demo。 客户端 客户端有两点需要注意,在传输分两个一个是文件总块数和文件块,。传输文件总块数让服务器知道有多少文件块需要接收,确保所有数据都被完整地发送到服务器,避免因文件块数不对导致文件重组失败。 传输文件总块数 int

初学HTML用法大全指导(五)html建立网页中的表单与DIV、SPAN分块

上一篇博客我们讲了html脚本语言中超链接的创建与使用,这一篇博客我们来聊一聊web网页中常用的表单的建立,我们在登录一个新的网站时想成为这个网站的VIP会员或者普通用户时常常面临着各种信息的登记,以及在登录这个系统时要输入自己的账户和密码,比如CSDN中,我们想登录进入自己的账户时,就要输入账户和密码。这是HTML脚本语言中的表单操作就称为了很重要的作用。最常见的表单标签有:文本框

大文件分块上传和续传

给出一个Spring Boot项目中完成大文件分块上传和续传功能的完整示例代码解释,下面的示例将集中展示前端与后端的交互过程,将分别从客户端(前端)以及服务器端(后端)实现的角度来看实现思路。 定前端使用了axios进行与后端的交互,后端则利用Spring Boot来响应前端的请求和处理文件。 客户端(前端)实现 客户端的实现主要是利用axios或任何HTTP库,如fetch,来分块上传文件