首页
Python
Java
IOS
Andorid
NodeJS
JavaScript
HTML5
【
BZOJ4241 历史研究 莫队 堆
】的更多相关文章
BZOJ4241 历史研究 莫队 堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目 Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连续N天发生的时间,大约每天发生一件. 事件有种类之分.第i天(1<=i<=N)发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大. JOI教授决定用如下的方法分析这些日记: 1. 选择日记中连…
BZOJ 4241: 历史研究——莫队 二叉堆
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4241 题意:N个int范围内的数,M次询问一个区间最大的(数字*出现次数)(加权众数),可以离线. 似乎正解是分块...因为可以离线&&时限大,用莫队算法卡常水过了(捂脸). 具体方法:先按莫队方法把询问排序,然后考虑转移. 把所有数字离散化,记录每个数的(数字*出现次数),当我们加入/拿走一个数的时候,更新这个值,并维护二叉堆. 复杂度:\(O(N \sqrt N log N)\)…
【题解】BZOJ4241: 历史研究(魔改莫队)
[题解]BZOJ4241: 历史研究(魔改莫队) 真的是好题啊 题意 给你一个序列和很多组询问(可以离线),问你这个区间中\(\max\){元素出现个数\(\times\)元素权值} IOI国历史研究的第一人--JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连续N天发生的时间,大约每天发生一件. 事件有种类之分.第i天(1<=i<=N)发生的事件的种类用一个整数Xi表示,Xi越大,…
[JOISC2014]歴史の研究/[BZOJ4241]历史研究
[JOISC2014]歴史の研究/[BZOJ4241]历史研究 题目大意: 一个长度为\(n(n\le10^5)\)的数列\(A(A_i\le10^9)\),定义一个元素对一个区间\([l,r]\)的贡献为\(A_i\times cnt(A_i)\),其中\(cnt(A_i)\)表示\(A_i\)在区间内的出现次数.\(q(q\le10^5)\)次询问,每次询问一个区间内贡献最大的元素的贡献. 思路: 分块. \(cnt[i][j]\)表示前\(i\)块内\(j\)的出现次数,\(sum[i][…
BZOJ4241历史研究——回滚莫队
题目描述 IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连续N天发生的时间,大约每天发生一件. 事件有种类之分.第i天(1<=i<=N)发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大. JOI教授决定用如下的方法分析这些日记: 1. 选择日记中连续的一些天作为分析的时间段 2. 事件种类t的重要度为t*(这段时间内重要度为t的事件数) 3…
BZOJ4241:历史研究(回滚莫队)
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连续N天发生的时间,大约每天发生一件. 事件有种类之分.第i天(1<=i<=N)发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大. JOI教授决定用如下的方法分析这些日记: 1. 选择日记中连续的一些天作为分析的时间段 2. 事件种类t的重要度为t*(这段时间内重要度为t…
BZOJ4241 历史研究(莫队)
如果分块的话与区间众数没有本质区别.这里考虑莫队. 显然莫队时的删除可以用堆维护,但多了一个log不太跑得过. 有一种叫回滚莫队的trick,可以将问题变为只有加入操作.按莫队时分的块依次处理,一块中左端点的差不超过√n,右端点单调递增.首先将右端点也在该块中的询问暴力处理.然后令指针l在下一块开头,指针r在这一块结尾.暴力扩展右端点移动指针r,到达询问点时,移动指针l以回答询问,但不让指针l的移动对之后的询问产生影响,即回滚.这样就可以处理删除了. #include<iostream> #i…
2018.08.14 bzoj4241: 历史研究(回滚莫队)
传送们 简单的回滚莫队,调了半天发现排序的时候把m达成了n... 代码: #include<bits/stdc++.h> #define N 100005 #define ll long long using namespace std; ll cnt[N],tot[N],val[N],ans[N],rk[N],mp[N],tmp; int n,m,blo[N],block,num,pos=1,siz; struct Q{int l,r,id;}q[N]; inline ll read(){…
bzoj4241: 历史研究(回滚莫队)
传送门 这是一个叫做回滚莫队的神奇玩意儿 是询问,而且不强制在线,就决定是你了莫队 如果是每次插入一个数是不是很简单? 然而悲剧的是我们莫队的时候不仅要插入数字还要删除数字 那么把它变成只插入不就行了么? 我们莫队将询问分块的时候,以左端点所在块为第一关键字,右端点(不是右端点所在块)为第二关键字 对于每一个询问,如果左右端点在同一块中,直接暴力处理,复杂度\(O(\sqrt{n})\) 如果不在同一个块中呢?我们把所有左端点在同一块中的一起处理,那么右端点就是单调增的,这一部分只有插入,暴力计…
BZOJ4241 历史研究 【回滚莫队】
题目描述:给出一个长度为\(n\)的数组,每次询问区间 \([l,r]\),求 \(\max\limits_{x}x*cnt_x\),其中 \(cnt_x\) 表示 \(x\) 在区间 \([l,r]\) 的出现次数. 数据范围:\(n\le 10^5,a_i\le 10^9\). 分块也可以做到 \(O(n\sqrt{n})\),但是空间也是 \(O(n\sqrt{n})\).使用回滚莫队可以在 \(O(n)\) 空间内解决. 首先上来离散化,然后考虑莫队.发现这个东西增加一个数是 \(O(1…