lxl分块糊做

lxl分块糊做

[Ynoi2017] 由乃打扑克

me

想到了二分这个值+分块去找这个数的数的数量,复杂度O(Qlog2NN),然后块内可能用multiset或者啥来维护

tj

更优的做法是块内维护一个排好序的序列,不过硬要说和multiset本质确实一样,但是这样常数和写法上会优的多

CodeChef Chef and Churu

me

对函数的下标分块,然后对每个块内维护两个序列,一个以l从小到大排序,一个以r从大到小排序

然后修改时,可以把所有函数都+yax,然后再把那些r<xl>x的函数的值+axy,有个很好的点就是这两个条件只会至多满足一个,这个就可以对于每个块算出块的答案,然后给两个序列的最后一个满足条件的挂上一个tag

查询的时候整块直接用存的那个值即可,散块就可以遍历块对应的两个序列,然后算tag的贡献

O(QNlogN)

tj

对下标分块,然后数组和函数都分块

函数查询[l,r]可以变成查询[l,n][r+1,n],于是可以给[l,n]的数的tag+1[r+1,n]tag1,这个tag表示一个数的值被计算的次数

然后函数的块要维护整块的答案,查询到整块就用函数的块

查询到散块的时候,可以用数组的块来O(1)的查询

复杂度O(QN)

Luogu3863 序列

me

不会喵

tj

以下标为一个轴,时间为另一个轴,然后值为此时间下此下标上的值

可以发现修改是修改的一个矩形,查询的是一个区间

于是可以扫描线+分块维护

O(QNlogN)

「BZOJ2038」小 Z 的袜子

me

一开始一直在想分块,然后感觉分块不可做,突然想到为啥不离线呢,于是就是莫队板子

O(QN)

[AHOI2013]作业

me

莫队,然后再用个树状数组来记录答案

O(QNlogN)

tj

对值域也分块,就可以去掉log

[Ynoi2016]这是我自己的发明

me

首先可以用dfn序把子树变成区间,然后一开始钦定1是根,如果后面根变成x的孩子y的子树中的一个点,对于x,它的新子树区间就是整个区间除去y子树的区间

那么现在就相当于查询两个区间[a,b][l,r]c[a,b](i)×c[l,r](i),于是可以类似于Luogu3863 序列,以一个查询为x轴,另一个为y轴,得到一个n×n的矩阵,然后ai,j=[coli==colj],查询即询问左下角为(a,l),右上角(b,r)的矩形的权值和

然后矩形的权值和可以用二维前缀和拆分成四个左下角(1,1),右上角为(x,y)的查询,那么原问题就被拆分成了许多个这样的查询,这个可以莫队维护

O(QN)

bzoj3920 Yuuna的礼物

me

区间查询可以莫队维护,然后k1可以数状数组/分块维护,k2可以set维护。。。?写的时候突然发现不行,幽默

tj

很牛!考虑用点来表示权值为v的点出现了k次,那么共有n个点,将这些点按照出现次数为第一关键字,权值为第二关键字排序,然后对这些点进行分块即可

O(QN)

[JOI2014] 历史研究(歴史の研究)

me

回滚莫队,O((N+Q)N)

tj

回滚莫队是其中一个做法,还有普通莫队的做法

和bzoj3920 Yuuna的礼物类似,用点来表示权值为v的点出现了k次,那么共有n个点,将这些点按照v×k排序,对这些点分块,那么用莫队维护区间,此时答案就是这n个点中,最靠后的存在的点

HNOI2016大数

me

就求区间内前缀余数相同的对数即可,莫队,O(QN)

tj

p=2/5的情况比较特殊,因为它们和10不互质

[IOI2009]regions

me

这怎么分块,都不让离线

tj

原来是根号分治,你说这个我就懂了嘛,幽默,根号分治算分块吗/fn

考虑当r1r2中的某一个大小大于B时,因为最多只存在nB个这样的地区,所以考虑预处理

预处理r1时,若为地区V,可以直接dfs,然后cnt记录x的祖先中有几个属于地区V的,然后记录进(V,ax)

预处理r2时,若为地区V,依旧dfs,记cntx的子树中有几个属于地区V的,然后记录进(ax,V)

这部分复杂度O(n2B)

然后若两个都大小小于B,则考虑dfn序,若yx的孩子当且仅当dfny[dfnx,dfnx+szx1],那么考虑对地区r1维护两个序列,一个以dfnx排序,一个以dfnx+szx1排序,r2维护一个以dfny排序的序列,那么对于r1中的点x,在r2中合法的y的范围为第l个到第r个,那么x的贡献为rl+1,拆开成r+1lr+1r1的第二个序列负责,l由第一个序列负责,然后双指针即可

复杂度O(QB)

因为NQ同阶,所以B=N,总复杂度O(NN)

SHOI2006 Homework

me

感觉对Y分块,然后通过什么性质每次X去更新Y的答案没啥出路,考虑每次对Y去找X

首先YB的,只有B个,这个可以每次用X去更新Y的答案

对于Y>B的,设X=k×Y+r,则只有VBk,那么考虑对Y去找X,枚举k,找到k×Y的最小的X,然后答案取min(ans,Xk×Y),可以用分块做到O(1)查询,O(V)维护

BV,复杂度O(NV)

[Ynoi2015] 此时此刻的光辉

me

对于cB的,只有B个,预处理

对于c>B的,最多走nB步,直接跳

O(NNlogN)

tj

可以长链剖分做到O(1)k级祖先,于是O(NlogN+NN)

具体的大概就是对于每条长链,记录链顶向上的第k个点与链上第k个点,k这条长链的长度

题解 P5903 【【模板】树上 k 级祖先

「Ynoi2015」 盼君勿忘

me

莫队维护区间,ans=ci×(2len2cnti)

cntiB的放到一起,然后算答案的时候枚举cnti算即可

cnti>B的最多nB个,这个单独算即可

O(QNlogN)

tj

优化了快速幂,用了光速幂,具体就是预处理出pwii[1,B],以及pwi×B

O(QN)

posted @   LuoyuSitfitw  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示