BZOJ 4241 分块】的更多相关文章

思路: 考虑分块 f[i][j]表示从第i块开头到j的最大值 cnt[i][j]表示从第i块开始到序列末尾j出现了多少次 边角余料处理一下就好啦~ //By SiriusRen #include <cmath> #include <cstdio> #include <algorithm> using namespace std; ; int n,q,Block,a[N],block[N],cpy[N],u; ][N],top,stk[N],num[N]; typedef…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4241 套路:可以大力预处理,如果求区间加权众数,可以预处理i~j块(或 j 位置)的最大值,为了暴力再预处理i~j块每个数出现次数:这个i~j可以记录成从第i块开始的后缀,这样空间还是n*w. 如果不无脑开long long可以快18s. #include<iostream> #include<cstdio> #include<cstring> #include&…
题目链接 \(Description\) 长度为n的数列,m次询问,每次询问一段区间最大的 \(A_i*tm_i\) (重要度*出现次数) \(Solution\) 好像可以用莫队做,但是取max的操作普通莫队是不好撤销的(Subd部分) 于是可以用不带删除的莫队: 回滚莫队 询问依旧是按(左端点所在块,右端点)排序 1.对于同在一块的询问,暴力查询,最差O(sqrt(n)) 2.对于不在同一块的询问(左端点ql在左边,右端点qr在右边的某块) 我们对左端点相同的询问一起考虑,这时r一定是单调递…
题意 题解 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; ; ][N],top,stack[N],num[N]; ][N]; int main(){ scanf("%d%d",&n,&m); Block=sqrt(n); ;i<=n…
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4241 题意:N个int范围内的数,M次询问一个区间最大的(数字*出现次数)(加权众数),可以离线. 似乎正解是分块...因为可以离线&&时限大,用莫队算法卡常水过了(捂脸). 具体方法:先按莫队方法把询问排序,然后考虑转移. 把所有数字离散化,记录每个数的(数字*出现次数),当我们加入/拿走一个数的时候,更新这个值,并维护二叉堆. 复杂度:\(O(N \sqrt N log N)\)…
Description IOI国历史研究的第一人——JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连续N天发生的时间,大约每天发生一件. 事件有种类之分.第i天(1<=i<=N)发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大. JOI教授决定用如下的方法分析这些日记: 1. 选择日记中连续的一些天作为分析的时间段 2. 事件种类t的重要度为t*(这段时间内重要度为t…
大题思路就是分块,将n个数分成sqrt(n)个块,然后 处理出一个w数组,w[i,j]代表第i个块到第j个块的答案 那么对于每组询问l,r如果l,r在同一个块中,直接暴力做就行了 如果不在同一个块中,l,r区间中整块的部分可以直接由w数组得到答案 然后多出来的部分暴力处理下出现次数,然后再预处理一个b数组,代表没 个数出现的位置,且每个数都连续,那么我们可以二分的找出在多余部分出现的 每个数在整区间内出现多少次,然后和多余部分出现的累加,判断奇偶更新答案 看了lyd的题解,写的挺好(其实这个题就…
多个询问l,r,求所有子区间异或和中最大是多少 强制在线 做法: 分块+可持久化trie 1.对于每块的左端点i,预处理出i到任意一个j,()i,j)间所有子区间异或和中最大为多少,复杂度O(\(n\sqrt n\)) 2.对于询问x,y: ①x,y属于同一块,O(\(\sqrt n log_2 n\))直接扫 ②x,y不属于同一块,找到x右边第一块的左端点,用预处理求出左端点到y,剩下的直接扫,O(\(\sqrt n log_2 n\)) 注意: 1.区间异或和转化为前缀和之后,要表示任意一个…
分块: 先预处理,将原序列分成长度为len的许多块,计算从第i块到第j块的答案,(可以做到O(n*n/len)). 每次询问时,将询问的区间分成三部分,:左边,中间,右边,中间是尽量大的一个块区间,其答案已经计算得到,左右两边加起来最多有2*len个元素,暴力计算其对答案的影响.O(q*len*f(n)),f(n)是暴力加入一个元素的代价. 这道题f(n)是log(n) 总的复杂度:f(n) = O( n*n/len + q*len*log(n) ), 当len = n*(q*log(n))-1…
题意:给定\(a[l...r]\),多次询问区间\([l,r]\)中的最大连续异或和\(a_i⊕a_{i+1}⊕...⊕a_{j},l≤i≤j≤r\) 一眼过去认为是不可做的,但题目给出\(n=1.2e4\),提供了分块暴力的余地 首先处理成前缀形式,对于询问\([l,r]\)既为\([l-1,r]\)中寻找两个数xor最大 维护\(f[i][j]\):第i个块到第j个数的任意异或最大值 这个只需\(O(30*n\sqrt{n})\)的代价即可预处理 对于每次询问,首个残缺的块暴力,其余块直接由…