【分块】bzoj2724 [Violet 6]蒲公英
分块,离散化,预处理出:
①前i块中x出现的次数(差分);
②第i块到第j块中的众数是谁,出现了多少次。
询问的时候,对于整块的部分直接获得答案;对于零散的部分,暴力统计每个数出现的次数,加上差分的结果,尝试更新ans。
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,sum,sz,num[],l[],r[],plv[][],mode[][],mplv[][];
int a[],en,Time[],x,y,ma[],ans;
struct Point{int v,p;}b[];
bool operator < (const Point &a,const Point &b){return a.v<b.v;}
int Res,Num;char C,CH[];
inline int G()
{
Res=;C='*';
while(C<''||C>'')C=getchar();
while(C>=''&&C<=''){Res=Res*+(C-'');C=getchar();}
return Res;
}
inline void P(int x)
{
Num=;if(!x){putchar('');puts("");return;}
while(x>)CH[++Num]=x%,x/=;
while(Num)putchar(CH[Num--]+);
puts("");
}
void makeblock()
{
sz=(int)sqrt((double)n); if(!sz) sz=;
for(sum=;sum*sz<n;sum++)
{
l[sum]=r[sum-]+;
r[sum]=sum*sz;
for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
}
l[sum]=r[sum-]+;
r[sum]=n;
for(int i=l[sum];i<=r[sum];i++) num[i]=sum;
}
void LiSan()
{
sort(b+,b+n+);
for(int i=;i<=n;i++)
{
if(b[i].v!=b[i-].v) en++;
ma[a[b[i].p]=en]=b[i].v;
}
}
void makeplv()
{
for(int i=;i<=n;i++)
for(int j=num[i];j<=sum;j++)
plv[a[i]][j]++;
}
void makemode()
{
for(int i=;i<=sum;i++)
{
memset(Time,,sizeof(Time));
int modenow,modeplv=;
for(int j=i;j<=sum;j++)
{
for(int k=l[j];k<=r[j];k++)
{
Time[a[k]]++;
if(Time[a[k]]>modeplv||(Time[a[k]]==modeplv&&a[k]<modenow))
{
modenow=a[k];
modeplv=Time[a[k]];
}
}
mode[i][j]=modenow;
mplv[i][j]=modeplv;
}
} memset(Time,,sizeof(Time));
}
int Getplv(const int &v,const int &L,const int &R){return plv[v][R]-plv[v][L-];}
int main()
{
n=G(); m=G();
for(int i=;i<=n;i++) {b[i].v=G(); b[i].p=i;}
makeblock(); LiSan(); makeplv(); makemode();
for(int i=;i<=m;i++)
{
x=G(); y=G(); x=(x+ans-)%n+; y=(y+ans-)%n+;
if(x>y) swap(x,y);
int modenow,modeplv=;
if(num[x]+>=num[y])
{
for(int j=x;j<=y;j++)
{
Time[a[j]]++;
if(Time[a[j]]>modeplv||(Time[a[j]]==modeplv&&a[j]<modenow))
{
modenow=a[j];
modeplv=Time[a[j]];
}
}
for(int j=x;j<=y;j++) Time[a[j]]--;
}
else
{
modenow=mode[num[x]+][num[y]-];
modeplv=mplv[num[x]+][num[y]-];
for(int j=x;j<=r[num[x]];j++)
{
Time[a[j]]++; int t=Time[a[j]]+Getplv(a[j],num[x]+,num[y]-);
if(t>modeplv||(t==modeplv&&a[j]<modenow))
{
modenow=a[j];
modeplv=t;
}
}
for(int j=l[num[y]];j<=y;j++)
{
Time[a[j]]++; int t=Time[a[j]]+Getplv(a[j],num[x]+,num[y]-);
if(t>modeplv||(t==modeplv&&a[j]<modenow))
{
modenow=a[j];
modeplv=t;
}
}
for(int j=x;j<=r[num[x]];j++) Time[a[j]]--;
for(int j=l[num[y]];j<=y;j++) Time[a[j]]--;
}
P(ans=ma[modenow]);
}
return ;
}
【分块】bzoj2724 [Violet 6]蒲公英的更多相关文章
- [BZOJ2724][Violet 6]蒲公英
[BZOJ2724][Violet 6]蒲公英 试题描述 输入 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 输出 输入示 ...
- BZOJ2724 [Violet 6]蒲公英 分块
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2724.html 题目传送门 - BZOJ2724 题意 求区间最小众数,强制在线. $n$ 个数,$m ...
- bzoj2724: [Violet 6]蒲公英(分块)
传送门 md调了一个晚上最后发现竟然是空间开小了……明明算出来够的…… 讲真其实我以前不太瞧得起分块,觉得这种基于暴力的数据结构一点美感都没有.然而今天做了这道分块的题才发现分块的暴力之美(如果我空间 ...
- bzoj2724: [Violet 6]蒲公英(离散化+分块)
我好弱啊..这题调了2天QwQ 题目大意:给定一个长度为n(n<=40000)的序列,m(m<=50000)次询问l~r之间出现次数最多的数.(区间众数) 这题如果用主席树就可以不用处理一 ...
- bzoj2724: [Violet 6]蒲公英 分块 区间众数 论algorithm与vector的正确打开方式
这个,要处理各个数的话得先离散,我用的桶. 我们先把每个块里的和每个块区间的众数找出来,那么在查询的时候,可能成为[l,r]区间的众数的数只有中间区间的众数和两边的数. 证明:若不是这里的数连区间的众 ...
- 【BZOJ2724】[Violet 6]蒲公英 分块+二分
[BZOJ2724][Violet 6]蒲公英 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n ...
- BZOJ 2724: [Violet 6]蒲公英( 分块 )
虽然AC了但是时间惨不忍睹...不科学....怎么会那么慢呢... 无修改的区间众数..分块, 预处理出Mode[i][j]表示第i块到第j块的众数, sum[i][j]表示前i块j出现次数(前缀和, ...
- BZOJ_2724_[Violet 6]蒲公英_分块
BZOJ_2724_[Violet 6]蒲公英_分块 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod ...
- BZOJ 2724: [Violet 6]蒲公英
2724: [Violet 6]蒲公英 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1633 Solved: 563[Submit][Status ...
随机推荐
- Codeforces Round #531 (Div. 3) F. Elongated Matrix(状压DP)
F. Elongated Matrix 题目链接:https://codeforces.com/contest/1102/problem/F 题意: 给出一个n*m的矩阵,现在可以随意交换任意的两行, ...
- POJ 3104 Drying(二分
Drying Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 22163 Accepted: 5611 Descripti ...
- CentOS 安装 debuginfo-install
安装debuginfo相关的包步骤如下: 1. 修改文件/etc/yum.repos.d/CentOS-Debuginfo.repo中的enabled参数,将其值修改为1 2. 使用命令: yum i ...
- idea使用(一)
基本上正式开发的常用工具基本都集成了,而且基本都在你非常容易触到的位置.说说我比较常用的: 1.ant 你懂的 2.maven你也懂的 3.SVN相比之下,IDEA的SVN的提交提供了更多的选项和功能 ...
- jquery学习总计
1,jquery的基础语法 $(selector).action(); 选择器(selector)查询和查找html元素,action()执行对函数的操作. 2.选择器 id,类,类型,属性,属性值等 ...
- nginx实时生成缩略图到硬盘上
现在随着各终端的出现(手机,ipad等平板),以及各种终端的手机分辨率和尺寸都不同,现在手机用户流量都是宝,网上出现了各种各样的生成缩略图功能的架构,有使用php实时生成缩略图的,也有用nginx + ...
- Django项目知识点汇总
目录 一.wsgi接口 二.中间件 三.URL路由系统 四.Template模板 五.Views视图 六.Model&ORM 七.Admin相关 八.Http协议 九.COOKIE 与 SES ...
- 【BZOJ2223&&3524】PATULJCI [主席树]
PATULJCI Time Limit: 10 Sec Memory Limit: 259 MB[Submit][Status][Discuss] Description Input 第一行两个整数 ...
- bzoj2442&&codevs4654 单调队列优化dp
这道题也是一道单调队列 很明显满足各种性质 f[i]表示i不选前面k-1个都选的最小损失 维护的是个单增队列 q[head]是队列最小值 代码十分简介 注意longlong就okay #include ...
- 【BZOJ】1725: [Usaco2006 Nov]Corn Fields牧场的安排
[算法]状压DP [题解]对于上一行的每个状态,每行进行DFS. #include<cstdio> #include<algorithm> #include<cstrin ...