传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4241

题意:N个int范围内的数,M次询问一个区间最大的(数字*出现次数)(加权众数),可以离线。

似乎正解是分块。。。因为可以离线&&时限大,用莫队算法卡常水过了(捂脸)。

具体方法:先按莫队方法把询问排序,然后考虑转移。

把所有数字离散化,记录每个数的(数字*出现次数),当我们加入/拿走一个数的时候,更新这个值,并维护二叉堆。

复杂度:\(O(N \sqrt N log N)\)

/**************************************************************
Problem: 4241
User: will7101
Language: C++
Result: Accepted
Time:29968 ms
Memory:5984 kb
****************************************************************/ #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=100005;
void rd(int &x){
x=0; int ch=getchar();
while(ch<'0'||'9'<ch) ch=getchar();
while('0'<=ch&&ch<='9') x=x*10+ch-'0', ch=getchar();
}
int N, M, V, S, be[MAXN], a[MAXN], id[MAXN], di[MAXN], num[MAXN];
ll ans[MAXN], hp[MAXN];
inline void add(int x){
hp[id[x]]+=num[x];
for(int i=id[x], j; i>1; i=j){
j=i>>1;
if(hp[i]>hp[j]){
swap(hp[i], hp[j]);
swap(id[di[i]], id[di[j]]);
swap(di[i], di[j]);
}else break;
}
}
inline void del(int x){
hp[id[x]]-=num[x];
for(int i=id[x], j;; i=j){
j=hp[i<<1]>hp[i<<1|1]?i<<1:i<<1|1;
if(j>V) break;
if(hp[i]<hp[j]){
swap(hp[i], hp[j]);
swap(id[di[i]], id[di[j]]);
swap(di[i], di[j]);
}else break;
}
}
struct Qry{
int l, r, id;
bool operator<(const Qry &o)const{
if(be[l]==be[o.l]) return (be[l]&1)?r>o.r:r<o.r;
return l<o.l;
}
}Q[MAXN];
void init(){
sort(num+1, num+N+1); V=unique(num+1, num+N+1)-num-1;
for(int i=1; i<=N; ++i) a[i]=lower_bound(num+1, num+V+1, a[i])-num;
for(int i=1; i<=V; ++i) id[i]=di[i]=i;
}
int main(){
rd(N), rd(M);
for(int i=1; i<=N; ++i) rd(a[i]), num[i]=a[i];
while(S*S<=M) S++;
for(int i=0; i<=N; ++i) be[i]=i/S;
init();
for(int i=0; i<M; ++i) rd(Q[i].l), rd(Q[i].r), Q[i].id=i;
sort(Q, Q+M);
for(int i=0, l=1, r=0; i<M; ++i){
while(r<Q[i].r) add(a[++r]);
while(l>Q[i].l) add(a[--l]);
while(l<Q[i].l) del(a[l++]);
while(r>Q[i].r) del(a[r--]);
ans[Q[i].id]=hp[1];
}
for(int i=0; i<M; ++i) printf("%lld\n", ans[i]);
return 0;
}

BZOJ 4241: 历史研究——莫队 二叉堆的更多相关文章

  1. BZOJ.4241.历史研究(回滚莫队 分块)

    题目链接 \(Description\) 长度为n的数列,m次询问,每次询问一段区间最大的 \(A_i*tm_i\) (重要度*出现次数) \(Solution\) 好像可以用莫队做,但是取max的操 ...

  2. BZOJ4241 历史研究 莫队 堆

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目 Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JO ...

  3. BZOJ 4241: 历史研究 ( 回 滚 )

    题目:  链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4241 题意:给你一个长度为n序列,m次查询,每次询问 一段区间 最大的  a[ i ...

  4. BZOJ 4241 历史研究

    Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. ...

  5. bzoj 4241 历史研究——分块(区间加权众数)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4241 套路:可以大力预处理,如果求区间加权众数,可以预处理i~j块(或 j 位置)的最大值, ...

  6. BZOJ 4241 历史研究(分块)

    题意 题解 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> ...

  7. 【BZOJ 1129】[POI2008]Per 二叉堆

    这个东西读完题之后,就能知道我们要逐位计算贡献.推一下式子,会发现,这一位的贡献,是当前剩余的数字形成的序列的总数,乘上所剩数字中小于s上这一位的数的个数与所剩数字的总数的比.所以我们维护“当前剩余的 ...

  8. luogu P4887 莫队二次离线

    珂朵莉给了你一个序列$a$,每次查询给一个区间$[l,r]$ 查询$l≤i<j≤r$,且$ai⊕aj$的二进制表示下有$k$个$1$的二元组$(i,j)$的个数.$⊕$是指按位异或. 直接暴力莫 ...

  9. luogu P4887 模板 莫队二次离线 莫队 离线

    LINK:模板莫队二次离线 很早以前学的知识点 不过 很久了忘了. 考虑暴力 :每次莫队更新的时候 尝试更新一个点到一个区间的答案 可以枚举二进制下位数为k的数字 看一下区间内的这种数字有多少个. 不 ...

随机推荐

  1. BZOJ 1789 Y形项链(思维)

    这题类似于1787,最后的节点一定是两点的LCA,这里也就是两个字符串的最长公共前缀. # include <cstdio> # include <cstring> # inc ...

  2. (转)把hadoop源码关联到eclipse工程

    把hadoop源码关联到eclipse工程     转:http://www.superwu.cn/2013/08/04/355 在eclipse中阅读源码非常方便,利于我们平时的学习,下面讲述如何把 ...

  3. [Violet]天使玩偶

    description Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把 ...

  4. ContestHunter暑假欢乐赛 SRM 05

    T1 组合数,求一下乘法逆元就行了 没取模 没1LL* 爆零了 T2 让最大子段和最小就行,跑最大子段和的时候若超过S就弹出堆中最大的数,每次有负数加进来不断弹出最小的数相加重新加进堆直到为正数,因为 ...

  5. 关于Mybatis的@Param注解 及 mybatis Mapper中各种传递参数的方法

    原文:https://blog.csdn.net/mrqiang9001/article/details/79520436 关于Mybatis的@Param注解   Mybatis 作为一个轻量级的数 ...

  6. shell运用

    在shell脚本一 中,我讨论了shell脚本的语法规范,shell脚本的变量,以及shell脚本的测试语句. 仅仅懂得这些只能写简单的脚本,在简单的脚本中各条语句按顺序执行,从而实现自动化的管理,顺 ...

  7. hdu 5620

    KK's Steel Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  8. easing.js让页面动画丰富起来

    jQuery Easing是一款比较老的jQuery插件,在很多网站都有应用,尤其是在一些页面滚动.幻灯片切换等场景应用比较多.它非常小巧,且有多种动画方案供选择,使用简单,而且免费. <scr ...

  9. maven工程pom.xml报Missing artifact net.sf.jasperreports:jasperreports:jar:6.2.0

    有时maven工程的pom.xml报以下类型错误: Description Resource Path Location TypeMissing artifact net.sf.jasperrepor ...

  10. 在linux下创建软链接(即目录映射)

    在linux中创建软链接,使用命令:ln -s. 语法:ln -s 源文件 目标文件.