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

//By SiriusRen #include <bits/stdc++.h> using namespace std; ; ][],g[N],tmp=; struct Node{int l,r,p,k,ans,id;}ask[N]; bool cmp(Node a,Node b){return a.l<b.l;} bool cmp2(Node a,Node b){return a.id<b.id;} int main(){ scanf("%d%d",&…
大题思路就是分块,将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})\)的代价即可预处理 对于每次询问,首个残缺的块暴力,其余块直接由…
题目链接 本质是维护斜率递增序列. 用分块的方法就是把序列分成sqrt(n)块,每个块分别用一个vector维护递增序列.查询的时候遍历所有的块,同时维护当前最大斜率,二分找到每个块中比当前最大斜率大的那个点.修改的时候只需要修改点所在的那个块即可.复杂度$O(m\sqrt nlogn)$ #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef double db; ; int n,m,h[N],in…
中文题面 这道题就是LightOJ某题的升级版 前段时间我是直接用√k前暴力后分块的处理方式,然后直接套个等差求和 这次看到了dalao的证明再次让我知道我好菜啊 在这里做下笔记,学习一下对于整除运算的分析方法 关于\([\frac{k}{i}]×i,i∈[1,n]\)的处理 令\(x∈[1,k],g(x)=[k/[k/x]],f(x)=k/x\) 有\(g(x) = [k/[f(x)]] ≥ [k/f(x)] = x\) 得到\(g(x) ≥ x\),换为底 \([k/g(x)]≤[k/x]\…
思路: 注意到len<=10 按照权值max-min<=sqrt(n)*len 分块 记一下前缀和  每修改sqrt(n)次以后重新分块   修改的时候整块打标记  两边重构 (这题常数卡得要死   找同学要来fread才过) 查询的时候 就 二分答案 O(sqrt(n))判断 二分的上界要实时根据maxdeep变化才能过 //By SiriusRen #include<bits/stdc++.h> using namespace std; ; int n,m,op,xx,yy,l…
思路: (是不是只有我作大死写了个分块) up[i][j]表示从第i块开始到第j个位置 上升的最大值 down[i][j]同理 left_up[i]表示从第i块开始能够上升的最长长度 left_down[i]同理 right_up[i]表示从第i块结尾上升的最长长度 right_down[i]同理 然后就是各种恶心的分类讨论 (见代码吧,,,,,,) 嗯这道题还可以差分以后线段树维护>0的最长长度(左max 右max 区间max) //By SiriusRen #include <cmath&…
思路: 跟今年WC的题几乎一样 (但是这道题有重 不能用bitset水过去) 正解:分块FFT http://blog.csdn.net/geotcbrl/article/details/50636401    from GEOTCBRL 可以看看hgr的题解..写得很详细 //By SiriusRen #include <cmath> #include <cstdio> #include <cstring> #include <algorithm> usi…