【BZOJ4241】历史研究 分块
【BZOJ4241】历史研究
Description
Input
Output
Sample Input
9 8 7 8 9
1 2
3 4
4 4
1 4
2 4
Sample Output
8
8
16
16
HINT
题解:第一眼看题都感觉是莫队吧?然而听说这题卡莫队。
这题的本质是一个带权的区间众数问题,如果你会做区间众数,那么这道题也不难(当然不会做也无所谓)。
先分块,假设[a,b]是[l,r]中一段连续的整块,那么[l,r]中的带权众数∈([a,b]中的众数 U [l,a)和(b,r]中的所有数)。那么我们预处理出任意两个块(a,b)之间的带权众数(方法:枚举左边的块,在暴力扫一遍右边的所有块,用桶记录一下,维护个最大值),以及[1,a]中所有数出现的次数。处理询问时,先直接拿出中间整块的众数,再枚举两边小块的所有数即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn=100010;
int n,m,nm,B;
ll ans;
struct node
{
int val,org;
}num[maxn];
int v[maxn],ref[maxn],st[maxn],s[400][maxn];
ll mx[400][400];
bool cmp(node a,node b)
{
return a.val<b.val;
}
int rd()
{
int ret=0; char gc=getchar();
while(gc<'0'||gc>'9') gc=getchar();
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret;
}
int main()
{
n=rd(),m=rd();
B=int(sqrt(double(n)));
int i,j,k,a,b,c,d;
for(i=0;i<n;i++) num[i].val=rd(),num[i].org=i;
sort(num,num+n,cmp);
for(ref[0]=-1,i=0;i<n;i++)
{
if(num[i].val>ref[nm]) ref[++nm]=num[i].val;
v[num[i].org]=nm;
}
for(i=0;i<n;i++) s[i/B][v[i]]++;
for(i=1;i*B<n;i++) for(j=1;j<=nm;j++) s[i][j]+=s[i-1][j];
for(i=0;i*B<n;i++)
{
for(j=i;j*B<n;j++)
{
mx[i][j]=mx[i][j-1];
for(k=j*B;k<j*B+B&&k<n;k++) st[v[k]]++,mx[i][j]=max(mx[i][j],(ll)st[v[k]]*ref[v[k]]);
}
memset(st,0,sizeof(st));
}
for(i=1;i<=m;i++)
{
a=rd()-1,b=rd()-1,c=a/B,d=b/B,ans=0;
if(c==d)
{
for(j=a;j<=b;j++) st[v[j]]++,ans=max(ans,(ll)st[v[j]]*ref[v[j]]);
for(j=a;j<=b;j++) st[v[j]]=0;
printf("%lld\n",ans);
continue;
}
ans=mx[c+1][d-1];
for(j=a;j<c*B+B;j++) st[v[j]]=s[d-1][v[j]]-s[c][v[j]];
for(j=d*B;j<=b;j++) st[v[j]]=s[d-1][v[j]]-s[c][v[j]];
for(j=a;j<c*B+B;j++) st[v[j]]++,ans=max(ans,(ll)st[v[j]]*ref[v[j]]);
for(j=d*B;j<=b;j++) st[v[j]]++,ans=max(ans,(ll)st[v[j]]*ref[v[j]]);
for(j=a;j<c*B+B;j++) st[v[j]]=0;
for(j=d*B;j<=b;j++) st[v[j]]=0;
printf("%lld\n",ans);
}
return 0;
}
【BZOJ4241】历史研究 分块的更多相关文章
- [bzoj4241][历史研究] (分块)
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...
- bzoj4241 历史研究——分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4241 就是分块,预处理出从第 i 块到 j 位置的答案,以及从第 i 块到最后位置间每个数出 ...
- [JOISC2014]歴史の研究/[BZOJ4241]历史研究
[JOISC2014]歴史の研究/[BZOJ4241]历史研究 题目大意: 一个长度为\(n(n\le10^5)\)的数列\(A(A_i\le10^9)\),定义一个元素对一个区间\([l,r]\)的 ...
- 【题解】BZOJ4241: 历史研究(魔改莫队)
[题解]BZOJ4241: 历史研究(魔改莫队) 真的是好题啊 题意 给你一个序列和很多组询问(可以离线),问你这个区间中\(\max\){元素出现个数\(\times\)元素权值} IOI国历史研究 ...
- BZOJ4241 历史研究
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...
- BZOJ4241 历史研究 莫队 堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目 Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JO ...
- BZOJ4241历史研究——回滚莫队
题目描述 IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连 ...
- BZOJ4241:历史研究(回滚莫队)
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...
- BZOJ4241 历史研究(莫队)
如果分块的话与区间众数没有本质区别.这里考虑莫队. 显然莫队时的删除可以用堆维护,但多了一个log不太跑得过. 有一种叫回滚莫队的trick,可以将问题变为只有加入操作.按莫队时分的块依次处理,一块中 ...
随机推荐
- jdbc in postgres
try { Class.forName("org.postgresql.Driver").newInstance(); String url = "jdbc:postgr ...
- 用python登录WeChat(微信) 实现自动回复(非常详细)
如要转载 麻烦备注好原文出处!!! 最近实现了一些微信的简单玩法 我们可以通过网页版的微信微信网页版,扫码登录后去抓包爬取信息,还可以post去发送信息. >>安装itchat这个库 ...
- Python包管理工具pip的基本使用
1.简介 pip 是一个Python包管理工具,主要是用于安装 PyPI 上的软件包,可以替代 easy_install 工具. 2.pip安装 如果你安装的Python 2 >=2.7.9 或 ...
- java值传递和引用传递的理解
java的基础数据类型有:(byte.short.int.long.float.double.char.boolean)八种 基础数据都是值传递,其他都是引用传递.但是引用传递要特别注意:String ...
- WinSCP介绍、安装、使用(转)
http://blog.csdn.net/liang19890820/article/details/49700931 前言 如果说XManager通过Xshell.Xftp可以很方便的进行远程管理, ...
- dedecms图片列表效果调用
效果如图 代码如下: <div class="listbox"> <ul class="e1"> {dede:list pagesize ...
- CEF生成JSON数据
在"使用CEF的JSON解析功能"中介绍了使用CefParseJson方法,与之相应的另一个CefWriteJson方法,能够用来生成JSON串(或二进制),其函数原型例如以下: ...
- Google SEO 学习网站记录
在搜索结果中创建良好的标题和摘要: https://support.google.com/webmasters/answer/35624?hl=zh-Hans&ref_topic=600194 ...
- 手机APP脚本录制(LoadRunner 12)
最近因项目需要,研究了下手机APP脚本录制方法,有需要的童鞋可参考使用! 方法1: 在手机网络中设置网络代理,使用LR12选择Mobile Application – HTTP/HTML协议中代理录制 ...
- js 淘宝评分
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...