摘要:
题面 "Bzoj" "洛谷" 题解 ~~大力分块~~,分块大小$\sqrt n$,对于每一个元素记一下跳多少次能跳到下一个块,以及跳到下一个块的哪个位置,修改的时候时候只需要更新元素所在的那一块即可,然后询问也是$\sqrt n$的模拟。 cpp include include include in 阅读全文
摘要:
题面 "Bzoj" "洛谷" 题解 点分治套路走一波,考虑$calc$函数怎么写,存一下每条路径在$\%3$意义下的路径总数,假设为$tot[i]$即$\equiv i(mod\ 3)$,这时当前的贡献就是$tot[0]^2+2\times tot[1]\times tot[2]$。 cpp inc 阅读全文
摘要:
题面 "Bzoj" "洛谷" 题解 显然,如果让你查询整个数列的最大异或和,建一颗$01Trie$,每给定一个$p$,按照二进制后反方向跳就行了(比如当前二进制位为$1$,则往$0$跳,反之亦反)。 但是现在要支持在最末尾插入和区间查询,将这颗$Trie$可持久化一下就好了(可持久化$Trie$敲板 阅读全文
摘要:
题面 有多组数据: "Poj" 无多组数据: "洛谷" 题解 点分治板子题,$calc$的时候搞一个$two\ pointers$扫一下统计答案就行了。 cpp include include include include using std::min; using std::max; using 阅读全文
摘要:
题面 "Bzoj" "洛谷" 题解 考虑莫队算法,首先对询问进行分块(分块大小为$sqrt(n)$),对于同一个块内的询问,按照左端点为第一关键字,右端点为第二关键字排序。我们统计这个区间内相同的颜色有多少个,假设某种颜色$i$有$j$个,则贡献就是$j\times(j 1)$,最后记得化成既约分数 阅读全文
摘要:
题面 "Bzoj" "洛谷" 题解 考虑对操作离线后分块处理询问操作(莫队算法),将询问操作按照编号分块后左端点第一关键字,右端点第二关键字排序(分块大小为$n^{\frac 23}$),对于每一个询问操作,记下当前最后一个修改操作。 之后就是莫队的板子了。 cpp include include 阅读全文
摘要:
题面 "Poj" 题解 下面内容引用自"李煜东 《算法竞赛进阶指南》"(对原文略有缩减,侵删): 因为矩形的大小固定,所以矩形可以由它的任意一个顶点唯一确定。我们可以考虑把 矩形的右上角顶点放在什么位置 ,圈住的星星亮度总和最大。 所以,对于一颗星星,能够覆盖住这颗星星的右上角的位置在区间$[x,y 阅读全文
摘要:
题面 "Poj" 题解 不难发现最后一位就是$pre[n]+1$,然后消除这个位置对其他位置的贡献,从左到右扫一遍,必定有至少一个位置可以得出,循环这个过程,$O(n^2)$出解。 cpp include include include include using std::min; using s 阅读全文
摘要:
题面 "Poj" 题解 区间求和$+$区间修改板子,这里用分块写的 cpp include include include include using std::min; using std::max; using std::swap; using std::sort; typedef long l 阅读全文
摘要:
题面 "Poj" 题解 这里采用并查集的补集。 $x$表示同类集合,$x+n$表示敌人集合,$x+n\times2$表示敌人的敌人集合。 如果当前给出的是一对同类关系,就判断$x$是否吃$y$或者$y$是否吃$x$(冲突)。 如果是真话,就将所有关系连在一起。 反之,如果给出的是一对$x$吃$y$关 阅读全文
摘要:
题面 "Poj" 题解 反正只要你判断是否满足区间的奇偶性,假设每一位要么是$1$要么是$0$好了。 假设有$S$的前缀和为$sum[]$,则有: 若$S[l...r]$中有奇数个$1$,则$sum[l 1]$与$sum[r]$不同奇偶;反之,则同奇偶 用一个带权并查集维护,设权值数组$s[i]$表 阅读全文
摘要:
题面 "Bzoj" "洛谷" 题解 考虑离线做法,逆序处理,一个一个星球的加入。用并查集维护一下连通性就好了。 具体来说,先将被消灭的星球储存下来,先将没有被消灭的星球用并查集并在一起,这样做可以路径压缩,然后再将被消灭的星球倒着一个一个加入,然后在$union$的时候,如果两个元素不在同一个集合中 阅读全文