分块大法好
L_0_Forever_LF
一个热爱OI的OIer
展开
-
BZOJ2453: 维护队列&2120: 数颜色
pre[i]表示与i颜色相同的上一个在pre[i]的位置,nex[i]表示下一个,那么询问可以转化成问[l,r][l,r]里pre<lpre<l的有多少个 分块,每个块内将pre排序。 询问时扫过去每个块内二分一下<l<l的位置,两端的块在块内扫一遍 将第x位置修改成y时要修改3个pre值,pre[x],pre[nex[x]],x后第一个y颜色的pre,用nex和set可以辅助查找,修改完在自原创 2016-10-25 20:38:50 · 605 阅读 · 0 评论 -
CodePlus3月月赛 博弈论与概率统计
求n+m局游戏恰好赢了n局的游戏的期望得分 记胜为+1,负为-1 期望得分可以用每种序列的得分*该种序列出现概率求和,最后再除以恰好出现n个1的概率 由此可以发现每种序列出现概率是相同的,就是说这个p并没有什么用 记 prei=∑ij=1ai prei=∑j=1iai\ pre_i=\sum_{j=1}^ia_i 一种序列的得分可以表示为∑ai−min{prei}∑a...原创 2018-03-05 16:15:56 · 708 阅读 · 0 评论 -
BZOJ2957: 楼房重建
楼房i被看见的条件是他和起点连线的斜率是1~i里最大的可以用线段树做 维护每个区间的ans,max 合并区间的时候, 左区间的ans是可以直接加的, 对于右区间,当左区间的max>右区间max时,整个区间被挡住,没有贡献 当左区间的max<右区间max时,需要递归下右区间找 递归过程中,带一个这个区间前方的斜率max, 当max<左子区间的max时,这个带下来的max对右子区间的贡献无原创 2017-04-23 20:35:25 · 507 阅读 · 0 评论 -
BZOJ3809: Gty的二逼妹子序列
空间这么小…然后就莫队了(不知道三维kd-tree能不能过) 本来想打BIT,结果发现过不了的样子,因为修改比较多,询问比较少,所以可以考虑平衡复杂度,用分块维护(修改O(1),询问O(n√\sqrt n))code:#include<set> #include<map> #include<deque> #include<queue> #include<stack> #include<cmath>原创 2017-03-18 09:07:12 · 587 阅读 · 0 评论 -
分块小总结
分块这个东西吧,其实它就是个暴力。。。想一些序列、树上问题,想来想去没什么想法了可以分块(树上分块我好像还不会QAQ)分块能处理一些数据结构很难处理或者不能处理的东西(如有间隔的询问、修改),分块也有标记而且也需要支持标记合并分块有很多分块的方法,可以对处理的序列分块,对操作分块,对询问分块等分块很多时候都是对于被完整覆盖的块通过标记或预处理O(1)O(1)修改或查询,没有完整覆盖的暴力重构或查询如原创 2016-10-28 10:31:41 · 960 阅读 · 2 评论 -
BZOJ2821: 作诗(Poetize)
分块,因为没有修改的操作,在线询问,所以可以预处理出s[i][j]表示1到i块j出现的次数,f[i][j]表示i到j块有多少数出现次数为偶数,询问时两端的块暴力做一下就行了 题目卡空间(有毒),把块的大小调一下就没问题了code:#include<set> #include<map> #include<deque> #include<queue> #include<stack> #include<原创 2016-10-28 09:52:56 · 747 阅读 · 0 评论 -
codechef minxor
分块,每个块开一棵字典树,暴力询问,修改时没有被完整覆盖的块暴力重构code:#include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<climits> #include<iostream> #include<algorithm> #define ll long long using namespace原创 2016-10-27 20:24:13 · 455 阅读 · 0 评论 -
BZOJ2724: [Violet 6]蒲公英
分块 不带修改的,可以先预处理f[i][j]表示第i块到第j块的众数,s[i][j]表示第1到第i块j出现的次数,每加入一个块,新的众数只可能是原块的众数、新块的众数或新块里的一个数,在新块里找一下就可以了,预处理O(nn−−√)O(n \sqrt n) 询问的话,被完全覆盖的块的众数可以O(1)O(1)知道,然后和求f[i][j]类似,在两端的块内暴力找一下code:#include<set>原创 2016-10-27 13:37:35 · 789 阅读 · 0 评论 -
codechef Chef and Churu
传送门 将n个函数分块,预处理出每个位置在每个函数里用到多少次,修改时维护每个块内所有函数的和,询问时被完整覆盖的块直接累加和,被部分覆盖的块用树状数组暴力求和 要用unsigned long longcode:#include<set> #include<map> #include<deque> #include<queue> #include<stack> #include<cmath> #原创 2016-10-27 09:32:58 · 507 阅读 · 0 评论 -
BZOJ3509: [CodeChef] COUNTARI
想不到怎么办,分块试一下 块内的可以直接DP出来,块与块之间的,化一下公式发现ai+ak=2aja_i+a_k=2a_j,所以处理第i块,维护1~i-1块每个数出现次数,i+1~n块每个数出现次数,FFT卷积一下,枚举块内的每个值的两倍累加上答案 鉴于FFT常数大,块的大小定为1800左右比较合适code:#include<set> #include<map> #include<deque> #原创 2016-10-26 22:17:10 · 1020 阅读 · 0 评论 -
BZOJ2388: 旅行规划
分块,每一块维护前缀和,观察发现,一次区间加操作对于LL前,RR后的区间里相对的大小关系没有影响,对于[L,R][L,R]里,将每个位置放在平面内作为一个点(i,si)(i,s_i),那么相当于给区间里加了一个斜率。 每个块维护一个凸包(上凸下凸应该都可以,下文以上凸为例),如果这个块被完整覆盖,就打个斜率的标记,否则暴力重构凸包。 询问时在区间里二分,找到一个最大的斜率(u,v)(u,v)使得原创 2016-10-26 16:16:27 · 844 阅读 · 0 评论 -
BZOJ3343: 教主的魔法
因为询问大于等于一个值的数量,还要支持区间加,考虑操作数不多,可以分块 因为操作数很少,每个块内排序,询问时两端点的块扫一遍,中间的块二分,修改时如果覆盖了整个块就给这个块打个标记,否则暴力修改后重新排序,每次修改&询问复杂度O(n−−√logn−−√)O(\sqrt n log \sqrt n)code:#include<set> #include<map> #include<deque> #i原创 2016-10-26 09:58:59 · 975 阅读 · 0 评论 -
BZOJ2002: [Hnoi2010]Bounce 弹飞绵羊
分块,每个点处理他跳到下一块时跳到哪个点,需要多少步 询问时一个一个块跳 修改时修改整个块的信息 code:#include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<climits> #include<iostream> #include<algorithm> using namespace st原创 2016-10-25 20:41:12 · 700 阅读 · 0 评论 -
LOJ#2461. 「2018 集训队互测 Day 1」完美的队列
可以先看一下这篇,写的比较详细了 我们考虑对每个询问jjj求出一个ed[j]ed[j]ed[j],表示在执行完(j,ed[j]](j,ed[j]](j,ed[j]]的操作后,jjj在序列里加入的所有xxx全部被pop出去了,就可以对每个颜色xxx求出若干个存在的区间,将这些区间取并,即可差分贡献到答案 现在考虑怎么求ed[j]ed[j]ed[j] 我们将原序列分块,操作jjj覆盖了若干个整块...原创 2018-06-14 08:03:45 · 1091 阅读 · 0 评论