bzoj2724 [Violet 6]蒲公英 分块

编程入门 行业动态 更新时间:2024-10-17 22:13:19

bzoj2724 [Violet 6]<a href=https://www.elefans.com/category/jswz/34/1749164.html style=蒲公英 分块"/>

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]蒲公英 分块

本文发布于:2024-02-06 12:35:20,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1749157.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:蒲公英   Violet

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!