[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: 历史研究(魔改莫队) 真的是好题啊 题意 给你一个序列和很多组询问(可以离线),问你这个区间中\(\max\){元素出现个数\(\times\)元素权值} IOI国历史研究的第一人--JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连续N天发生的时间,大约每天发生一件. 事件有种类之分.第i天(1<=i<=N)发生的事件的种类用一个整数Xi表示,Xi越大,…
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连续N天发生的时间,大约每天发生一件. 事件有种类之分.第i天(1<=i<=N)发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大. JOI教授决定用如下的方法分析这些日记: 1. 选择日记中连续的一些天作为分析的时间段 2. 事件种类t的重要度为t*(这段时间内重要度为t…
题目描述 IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连续N天发生的时间,大约每天发生一件. 事件有种类之分.第i天(1<=i<=N)发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大. JOI教授决定用如下的方法分析这些日记: 1. 选择日记中连续的一些天作为分析的时间段 2. 事件种类t的重要度为t*(这段时间内重要度为t的事件数) 3…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目 Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连续N天发生的时间,大约每天发生一件. 事件有种类之分.第i天(1<=i<=N)发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大. JOI教授决定用如下的方法分析这些日记: 1. 选择日记中连…
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连续N天发生的时间,大约每天发生一件. 事件有种类之分.第i天(1<=i<=N)发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大. JOI教授决定用如下的方法分析这些日记: 1. 选择日记中连续的一些天作为分析的时间段 2. 事件种类t的重要度为t*(这段时间内重要度为t…
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连续N天发生的时间,大约每天发生一件. 事件有种类之分.第i天(1<=i<=N)发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大. JOI教授决定用如下的方法分析这些日记: 1. 选择日记中连续的一些天作为分析的时间段 2. 事件种类t的重要度为t*(这段时间内重要度为t…
如果分块的话与区间众数没有本质区别.这里考虑莫队. 显然莫队时的删除可以用堆维护,但多了一个log不太跑得过. 有一种叫回滚莫队的trick,可以将问题变为只有加入操作.按莫队时分的块依次处理,一块中左端点的差不超过√n,右端点单调递增.首先将右端点也在该块中的询问暴力处理.然后令指针l在下一块开头,指针r在这一块结尾.暴力扩展右端点移动指针r,到达询问点时,移动指针l以回答询问,但不让指针l的移动对之后的询问产生影响,即回滚.这样就可以处理删除了. #include<iostream> #i…
传送们 简单的回滚莫队,调了半天发现排序的时候把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(){…
传送门 这是一个叫做回滚莫队的神奇玩意儿 是询问,而且不强制在线,就决定是你了莫队 如果是每次插入一个数是不是很简单? 然而悲剧的是我们莫队的时候不仅要插入数字还要删除数字 那么把它变成只插入不就行了么? 我们莫队将询问分块的时候,以左端点所在块为第一关键字,右端点(不是右端点所在块)为第二关键字 对于每一个询问,如果左右端点在同一块中,直接暴力处理,复杂度\(O(\sqrt{n})\) 如果不在同一个块中呢?我们把所有左端点在同一块中的一起处理,那么右端点就是单调增的,这一部分只有插入,暴力计…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4241 就是分块,预处理出从第 i 块到 j 位置的答案,以及从第 i 块到最后位置间每个数出现的次数: 然后块内统计.块外暴力即可. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using na…
题目描述:给出一个长度为\(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…
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4241 分析 这题就是求区间权值乘以权值出现次数的最大值,一看莫队法块可搞,但仔细想想,莫队的加入很容易,但是删除需要维护许多东西,非常麻烦,于是就有dalao想出了一个新科技--回滚莫队.回滚莫队能使操作全部变成加入或全部变成删除.这道题我们需要全部变成加入. 怎么做呢?我们对询问进行处理,左端点在一个块中的先归在一起,然后以右端点为关键字进行排序,使得右端点靠前的在前.然后依次处理按…
题目连接 很显然可以想到分块,用f[i][j]表示块i到块j的ans,然后发现答案一定是f[i][j] 或者其他在边角出现的数字 我们在记下g[i][j]从开头到块i中的数字j出现的次数 这样就每一次就统计边角数字出现的次数,然后更新答案就好了 (好像莫对也可以做....) 注意每一次查询时不要memset,会T飞 # include<iostream> # include<cstdio> # include<cstring> # include<algorith…
AT1219 歴史の研究 题意 给定一个长为\(n\)的序列\(\{a\}\),询问区间\(a*cnt_a\)的最大值,即某个值乘上出现次数 回退莫队板子 只右移右指针和左指针每次回到块结尾即可. Code: #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define ll long long const int N=1e5+10; using std:…
[BZOJ4241]历史研究 Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连续N天发生的时间,大约每天发生一件. 事件有种类之分.第i天(1<=i<=N)发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大. JOI教授决定用如下的方法分析这些日记: 1. 选择日记中连续的一些天作为分析的时间段 2. 事件种类t的重要…
bzoj4241/AT1219 历史研究(回滚莫队) bzoj它爆炸了. luogu 题解时间 我怎么又在做水题. 就是区间带乘数权众数. 经典回滚莫队,一般对于延长区间简单而缩短区间难的莫队题可以考虑. 思路就是对于所有l在同一块的询问,只记录在这一块以外的扩展贡献,而对于在块内的部分每次暴力记录贡献. 可以证明还是 $ O(n \sqrt {n} ) $ . #include<bits/stdc++.h> using namespace std; typedef long long lin…
可在vj上提交:https://vjudge.net/problem/AtCoder-joisc2014_c 题意: IOI 国历史研究的第一人--JOI 教授,最近获得了一份被认为是古代 IOI 国的住民写下的日记.JOI 教授为了通过这份日记来研究古代 IOI 国的生活,开始着手调查日记中记载的事件. 日记中记录了连续 NN 天发生的时间,大约每天发生一件. 事件有种类之分.第 ii 天发生的事件的种类用一个整数 X_iXi​ 表示,X_iXi​ 越大,事件的规模就越大. JOI 教授决定用…
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连续N天发生的时间,大约每天发生一件. 事件有种类之分.第i天(1<=i<=N)发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大. JOI教授决定用如下的方法分析这些日记: 1. 选择日记中连续的一些天作为分析的时间段 2. 事件种类t的重要度为t*(这段时间内重要度为t…
Problem Description \(IOI\)国历史研究的第一人--\(JOI\)教授,最近获得了一份被认为是古代\(IOI\)国的住民写下的日记.\(JOI\)教授为了通过这份日记来研究古代\(IOI\)国的生活,开始着手调查日记中记载的事件. 日记中记录了连续\(N\)天发生的时间,大约每天发生一件. 事件有种类之分.第\(i\)天\((1<=i<=N)\)发生的事件的种类用一个整数\(X_i\)表示,\(X_i\)越大,事件的规模就越大. \(JOI\)教授决定用如下的方法分析这…
「JOISC 2014 Day1」 历史研究 Solution 子任务2 暴力,用\(cnt\)记录每种权值出现次数. 子任务3 这不是一个尺取吗... 然后用multiset维护当前的区间,动态加,删点即可. 子任务4 目前可以支持在\(o(log(n) )\)的时间里动态加,删单点了. 容易想到莫队. 直接用multiset维护复杂度\(o(n \sqrt n log(n))\).(一脸不可过) 稍微优化一下 ​ 若使用cnt记录的话,是没法很好的删点的. ​ 对于目前要处理的块\([l,r…
http://www.lydsy.com/JudgeOnline/problem.php?id=4241 (题目链接) 看到题目就联想到了[bzoj2809] Apio2012—dispatching.想了想权值分块+莫队,发现不好维护块内最值,又看了看80s的时间,于是怒水一发线段树+莫队,结果先WA后TLE,不断TLE,无论怎么改常数都不行,难道nlogn*sqrt(n)就是过不了吗!!不爽,蒯个题解,再见! 题意 求区间加权众数. solution 貌似是分块,离散化之后,用mx[i][j…
题目: BZOJ4241 分析: 本校某些julao乱膜的时候发明了个"回滚邹队",大概意思就是某个姓邹的太菜了进不了省队回滚去文化课 回滚莫队裸题qwq(话说这个名字是不是莫队本人起的啊这么萌zui 首先看到题询问区间信息+没强制在线,妥妥的莫队.然而朴素的莫队(开个桶记每种事件当前的重要度,用set或者堆之类维护一下答案)要\(O(n\sqrt n \log n)\),直接T了-- 兔崽子给我说有一种神奇的分块做法,然而我太菜了还没写,先挖个坑以后再补. 然后我去网上orz题解,看…
附带权值的类区间众数问题?不是很好策啊 发现题目没有强制在线,而且也只有询问操作,那么可以考虑莫队 但是这里的莫队有一个很显著的特征,插入的时候很好维护答案,但是删除的时候不好回退 那么有没有什么办法可以让莫队避免删除呢,当然是有的,而且这可以解决一大类类似问题 考虑类似于一般莫队的分块操作,我们再排序时以左端点所在块为第一关键字,右端点为第二关键字 那么我们可以根据左端点所在块分别处理这些询问 首先如果左右端点在同一块内,那么很简单,直接暴力统计完了直接删光光就好了,这是\(O(\sqrt n…
题意:给定N个数字,Q次询问,询问这个区间的最大加权众数是多少. 加权众数是指出现次数*数字大小.N,Q<1e5. 思路:不难发现可以N*sqrtN*logN的思路做,但是应该过不了. 这个Nsqrt是莫队的时间,log的支持加入和删除的数据结构的复杂度. 如果用配对堆的话,应该还是比较快的. 没有用办法去掉这个log呢. 回滚莫队: 排序:按照左端点所在块排序,如果左端点在同一块,则按照右端点大小排序. 分类处理:然后左端点在同一块的同时处理,(sqrt)次.我们维护一个num[],表示每个数…
传送门 看到出现次数自然地考虑莫队. 但是发现如果需要删除并动态维护答案的话,则要用一个堆来维护答案,增加了一个\(log\).但是加入操作却没有这个\(log\),所以我们考虑避免删除操作. 分块,设\(l_i,r_i\)表示第\(i\)个块的左右端点,设\(f_{i,j}\)表示区间\([l_i,r_j]\)的答案,可以枚举\(i\)然后枚举\(j\)做到\(O(n\sqrt{n})\): 接下来将询问离线,对于每一组询问如果左右端点距离\(\leq 2\sqrt{n}\)则暴力计算答案,否…
回滚莫队例题. 这题的意思大概是 设 \(cnt_i\) 为 l ~ r 这个区间 \(i\) 出现的次数 求\(m\) 次询问 求 l~r 的 max {\(a_i\) * \(cnt_i\)} \(n\) , \(m\) 同阶 \(1e5\) 没有强制在线? 我们考虑普通的莫队?如果最大值在某一段,当你把指针移到另一段,这个答案就失效了. 所以考虑回滚莫队. 回滚莫队的做法是 按左端点所在的块排序 如果相同 按右端点排序 然后对于每个块求解.弄个右指针在块的最右边. 分类讨论一下 如果左右指…
莫队 简单分析:题面含有IOI(惊),可知此题是IOI(数字三角形)难度(逃). 思路:回滚莫队 当然很多人都是抱着学回滚莫队的目标来看这道题的,所以这里介绍一下回滚莫队. 1.按莫队的思路讲询问排序. 2.查询时枚举每个区间,我们需要保证右端点是保持单调递增的,同时左端点每次在一个块中移动,以此来计算每个询问的值. 3.每一次到下一个块就讲左端点移回右端点,移的过程不需要再像莫队一样一个个移,只需要将莫队中改变的数据清0,然后将右端点赋值到左端点就可以了. 所以其实这道题是回滚莫队板子题. 代…
题目链接 \(Description\) 长度为n的数列,m次询问,每次询问一段区间最大的 \(A_i*tm_i\) (重要度*出现次数) \(Solution\) 好像可以用莫队做,但是取max的操作普通莫队是不好撤销的(Subd部分) 于是可以用不带删除的莫队: 回滚莫队 询问依旧是按(左端点所在块,右端点)排序 1.对于同在一块的询问,暴力查询,最差O(sqrt(n)) 2.对于不在同一块的询问(左端点ql在左边,右端点qr在右边的某块) 我们对左端点相同的询问一起考虑,这时r一定是单调递…
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4241 题意:N个int范围内的数,M次询问一个区间最大的(数字*出现次数)(加权众数),可以离线. 似乎正解是分块...因为可以离线&&时限大,用莫队算法卡常水过了(捂脸). 具体方法:先按莫队方法把询问排序,然后考虑转移. 把所有数字离散化,记录每个数的(数字*出现次数),当我们加入/拿走一个数的时候,更新这个值,并维护二叉堆. 复杂度:\(O(N \sqrt N log N)\)…