[日常摸鱼]bzoj2724蒲公英-分块
区间众数经典题~
http://begin.lydsy.com/JudgeOnline/problem.php?id=4839
这里可以提交~
题意大概就是没有修改的询问区间众数,如果有一样的输出最小的,强制在线,$n \leq 4*10^4,a_i \leq 10^9$。
log数据结构脑补一遍好像没什么可以做的,数据范围我们可以分块!
不过分块之前肯定要离散化一下,而且还要保存离散化前的数据(因为要回答的是出现最多的数),离散化的方法在上一篇博客里面~
假设分成$L$块,每块大小$s=\lfloor n/L \rfloor$,预处理出每一块的起点和终点$st[],ed[]$,然后再预处理出$O(L^2)$个连续的块里的答案(每种颜色的出现次数,最大次数和对应的颜色),这样预处理的复杂度是$O(n*L^2)$。
然后对于一个区间的询问$[x,y]$,一定能拆成连续的若干个块(假设对应的块是$[p,q]$)和至多两个不完整的块,对于中间连续的块直接用我们之前预处理的答案。两边的暴力更新。
一种更新方法是把两边的颜色都加到中间完整的一段去,然后更新答案,更新完之后再减回去。复杂度$O(\frac{mn}{L})$,于是总复杂度$O(n*L^2+\frac{mn}{L})$,$m,n$同阶,均值不等式告诉我们当$L=n^{\frac{1}{3}}$的时候复杂度取最小值为$O(n^{\frac{5}{3}})$
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define rep(i,n) for(register int i=1;i<=n;i++)
#define REP(i,a,b) for(register int i=a;i<=b;i++)
#define debug(x) printf("%s = %d , ",#x,x)
using namespace std;
const int T=40;
const int N=40005;
inline int read()
{
int s=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=0;c=getchar();}
while(c>='0'&&c<='9'){s=s*10+c-'0';c=getchar();}
return f?s:-s;
}
int n,Q,L,s,ans,cnt,tot,num,p,q;
int w[N],tw[N],v[N],b[N],c[T][T][N],f[T][T],d[T][T],st[T],ed[T];
inline void prework()
{
n=read();Q=read();
rep(i,n)w[i]=read(); L=(int)pow(n,1.0/3.0);
if(L)s=n/L;
rep(i,L)st[i]=(i-1)*s+1,ed[i]=i*s;
if(ed[L]!=n)st[L+1]=ed[L]+1,ed[++L]=n; memcpy(tw,w,sizeof tw);sort(tw+1,tw+n+1);
rep(i,n)if(i==1||tw[i]!=tw[i-1])v[++tot]=tw[i];
rep(i,n)b[i]=lower_bound(v+1,v+tot+1,w[i])-v;
REP(i,1,L)REP(j,i,L)
{
rep(k,tot)c[i][j][k]=c[i][j-1][k];
REP(k,st[j],ed[j])c[i][j][b[k]]++;
rep(k,tot)if(c[i][j][k]>f[i][j]||(c[i][j][k]==f[i][j]&&tw[k]<d[i][j]))
f[i][j]=c[i][j][k],d[i][j]=k;
}
}
inline void updata(int i)
{
c[p][q][b[i]]++;
if(c[p][q][b[i]]>cnt||(c[p][q][b[i]]==cnt&&b[i]<num))cnt=c[p][q][b[i]],num=b[i];
}
inline int solve(int x,int y)
{
if(x>y)swap(x,y);
int l,r;
for(register int i=1;i<=L;i++)if(x<=ed[i]){l=i;break;}
for(register int i=L;i>=1;i--)if(y>=st[i]){r=i;break;}
if(l+1<=r-1)p=l+1,q=r-1;
else p=q=0;
cnt=f[p][q];num=d[p][q];
if(l==r)
{
REP(i,x,y)updata(i);
REP(i,x,y)c[p][q][b[i]]--;
}else
{
REP(i,x,ed[p-1])updata(i);
REP(i,st[q+1],y)updata(i);
REP(i,x,ed[p-1])c[p][q][b[i]]--;
REP(i,st[q+1],y)c[p][q][b[i]]--;
}
return v[num];
} int main()
{
prework();
rep(i,Q)
{
int l,r;
l=read();r=read();
ans=solve((l+ans-1)%n+1,(r+ans-1)%n+1);
printf("%d\n",ans);
}
return 0;
}
[日常摸鱼]bzoj2724蒲公英-分块的更多相关文章
- [日常摸鱼]51nod1237-最大公约数之和V3-杜教筛
题意:求$\sum_{i=1}^n \sum_{j=1}^n gcd(i,j),n<=1e10$ 之前刚好在UVA上也做过一个这样求和的题目,不过那个数据范围比较小,一开始用类似的方法 $ans ...
- Hash 日常摸鱼笔记
本篇文章是Hash在信息学竞赛中的应用的学习笔记,分多次更新(已经有很多坑了) 一维递推 首先是Rabin-Karp,对于一个长度为\(m\)的串\(S\) \(f(S)=\sum_{i=1}^{m} ...
- [日常摸鱼]HDU1724 Ellipse-自适应Simpson法
模板题~ QAQ话说Simpson法的原理我还是不太懂-如果有懂的dalao麻烦告诉我~ 题意:每次给一个椭圆的标准方程,求夹在直线$x=l$和$x=r$之间的面积 Simpson法 (好像有时候也被 ...
- [日常摸鱼]bzoj1257余数之和
题意:输入$k,n$,求$\sum_{i=1}^n k \mod i$ $k \mod i=k-i*\lfloor \frac{k}{i} \rfloor $,$n$个$k$直接求和,后面那个东西像比 ...
- [日常摸鱼]bzoj1001狼抓兔子-最大流最小割
题意就是求最小割- 然后我们有这么一个定理(最大流-最小割定理 ): 任何一个网络图的最小割中边的容量之和等于图的最大流. (下面直接简称为最大流和最小割) 证明: 如果最大流>最小割,那把这些 ...
- [日常摸鱼]pojKaka's Matrix Travels-拆点+最大费最大流
方格取数的升级版,每个格子最多取一次. $k=1$的话就是个普及组的dp题,$k=2$就是在之前的基础上多加两维. 然而现在$k$太大了当然就不dp啦 对于$k=1$的情况我们还可以把$(i,j)$向 ...
- [日常摸鱼]loj6000「网络流 24 题」搭配飞行员
题面 应该是二分图匹配,不过我写的是网络最大流. dinic求二分图最大匹配:加个源点和汇点,源点连向二分图的一边所有点,二分图的另一边所有点连向汇点,很明显这样得到的最大流就是这个二分图的最大匹配. ...
- [日常摸鱼]poj1741Tree-点分治
还有两天就要去FJWC啦- 题意:一颗无根树,$k$为给定常数,求树上距离不超过$k$的点对的数量,多组数据,$n \leq 10^4$. 应该是点分治经典题~ 一般对于无根树我们都可以把它转变成有根 ...
- [日常摸鱼]bzoj1218[HNOI2003]激光炸弹-二维前缀
题意:二维网格一些格子有权值,求用边长为$r$的正方形能覆盖到格子权值和的最大值,格子大小$ \leq 5000$ 非常裸的二维前缀,然而 题目下标从0开始! QAQ 要是比赛就要爆零啦- #incl ...
随机推荐
- linux中的fork炸弹
学习bash脚本看到一段代码(老鸟应该知道)挺有意思,一时看不懂.该命令不需要管理员即可运行,请不要在你的机器上使用以下脚本,否则你知道你在干什么 :() { :|: & };: 参考链接:h ...
- ABBYY FineReader 14新增了什么
FineReader 是一款一体化的 OCR 和PDF编辑转换器,随着版本的更新,功能的增加,FineReader 14的推出继续为用户在处理文档时提高业务生产力,该版本包含若干新特性和功能增强,包括 ...
- 怎么用MindManager2019去做一个好的网络图
大家知道网络图吗?是由作业(箭线).事件(又称节点)和路线三个因素组成的.它是一种图解模型,形状如同网络,故称为网络图.运用网络图能够使步骤简洁明了,今天我我们就说一说网络图软件MindManager ...
- mac实用软件推荐 mac好用的软件
终于入手了梦寐以求的苹果电脑,但却发现其操作系统与Windows大相径庭!不会使用怎么办?不用担心,我们可以借助软件的力量.一款实用的Mac软件不仅能够使你的工作效率显著提高,同时它还能帮助你更快地熟 ...
- 14.java设计模式之命令模式
基本需求: 一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装app就可以控制对这些家电工作 这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个App分别控制,我们希望只要一个 ...
- 在Jenkins的帮助下让我们的应用CI与CD
上图三位大家应该很熟悉吧,借助这三者可以让我们的服务在Linux环境下持续集成.容器中持续部署. 本篇博客的项目是core webapi, .NET 5.0 在11号已经正式发布了,你们的项目都升级了 ...
- [C#.NET 拾遗补漏]13:动态构建LINQ查询表达式
最近工作中遇到一个这样的需求:在某个列表查询功能中,可以选择某个数字列(如商品单价.当天销售额.当月销售额等),再选择 小于或等于 和 大于或等于 ,再填写一个待比较的数值,对数据进行查询过滤. 如果 ...
- 线性代数中的线性方程组(chapter 1)
目录 线性代数中的线性方程组 线性方程组 行化简解法和阶梯型矩阵 向量方程 矩阵方程$Ax = b$ 线性代数中的线性方程组 第一章从线性方程组的角度,通过解线性方程组,开始解释数学矩阵,以及和线性代 ...
- 03Python网络编程系列之服务端
# 这里边是一个定义了服务端的一系列函数,是Python网络编程这本书第七章的第一个例子.# 这是供后边函数进行调用了,然后我们来进行研究网络的单线程编程,多线程编程.异步网络编程等.# 导入网络编程 ...
- BootstrapBlazor 组件库使用体验---Table篇
原文地址:https://www.cnblogs.com/ysmc/p/13323242.html Blazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 Ja ...