【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,可以将问题变为只有加入操作.按莫队时分的块依次处理,一块中 ...
随机推荐
- AC日记——石子归并 51nod 1021
石子归并 思路: 经典动态规划——归并类问题: 我们把状态划为n个,即1-n的n个长度为n个状态: 那么,每个长度为i的状态都可以由i-1个长度为i-1的状态推出: 所以,dp转移方程: dp[i][ ...
- bitmap自己项目中处理遇到的问题
String path = "图片路径";Bitmap bitmap = BitmapFactory.decodeFile(path);安卓处理图片都是Bitmap,然后取到图片的 ...
- 在C#用进程打开cmd与直接手动打开cmd是不一样的
网上找不着答案,想了一下觉得可能是不同的用户,用set看了一下环境变量果然是不同用户,要改一下 按以下方法改: http://www.cnblogs.com/babycool/p/3569183.ht ...
- BZOJ1858 [Scoi2010]序列操作(线段树)
题目链接 [Scoi2010]序列操作 考验代码能力的一道好题. 思想还是很简单的(直接上线段树),但是比较难写. #include <bits/stdc++.h> using names ...
- Codeforces 746G New Roads (构造)
G. New Roads ...
- Go语言调度器之主动调度(20)
本文是<Go语言调度器源代码情景分析>系列的第20篇,也是第五章<主动调度>的第1小节. Goroutine的主动调度是指当前正在运行的goroutine通过直接调用runti ...
- Linux基础学习1
安装问题 随意下载的:CentOS-5.5-i386-LiveCD-Release2.iso Live CD 是可以直接运行在内存当中的,而不是安装镜像. 如之前玩过的BT5一样,把BT5-LiveC ...
- ThinkPHP 中M方法和D方法的具体区别
M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...
- iOS后台解析
iOS后台 上个月给小妹买了一台6s 她问我双击 Home 键之后 弹出的那些应用会不会耗电 我找到一篇文章 正好说的就是这个问题 摘要翻译一下 原文地址 http://www.speirs.org/ ...
- 解释一下Windows dos中的符号
容许我放一段Windows的批处理: sc <server> [command] [service name] <option1> <option2>... < ...