05 2020 档案
摘要:"「JOISC 2016 Day 3」回转寿司" 这题我无力吐槽了... ~~强烈谴责出题人用脚造数据~~ 解法 其实这题主要还是部分分启发正解吧。看到有个$s_i = 1, t_i= n$的做法就是维护一个堆就可以了,所以扩展下就是分块,然后每个块维护一个堆。散块暴力,大块直接查。但是有个很坑爹的
阅读全文
摘要:"「JOISC 2016 Day 2」三明治" 这题真正让我感受了记搜的强大。 ~~我真的没想过搜索可以过$400$的啊喂~~ ~~对,$\text{NOI}$还可以过$1e5$呢~~ 解法 一个~~并不~~显然的$n^4$的做法是枚举每一个点,然后上下左右记忆化搜索。考试的时候觉得难打,但是~~看
阅读全文
摘要:"JOISC 2016 Day3 电报" 前置知识(伪) + 基环树 + 基环外向树 + 基环内向树 此题就是一棵基环外向树。 ~~其实这些都没什么用,跟这题没啥关系~~ 思路 考试的时候不会做,考完才发现自己就差那么一点点... 首先考虑这样一张图: 我们的目的是让整个图成为一个环,但是这显然不是
阅读全文
摘要:这题妙啊。 学会了一个新$trick$。 题解 $$|x_1 x_2|+|y_1 y_2| = \\ max (x_1 x_2+y_1 y_2,x_1 x_2 y_1+y_2, x_1+x_2+y_1 y2, x_1+x_2 y_1+y_2) = \\max((x_1+y_1) (x_2+y_2),
阅读全文
摘要:$CDQ$分治的妙题。 考虑按视野从大到小排序,那右边的可以看见左边的话左边一定看得见右边的,直接$CDQ$就行了。对于这种$[x K,x+K]$的区间维护可以在统计的时候差分也可以直接在更新的时候差分。本代码使用后者。
阅读全文
摘要:DP神题。。。 设$dp[i][j][0/1/2][0/1/2]$表示$[i,j]$这个区间内端点取不染色/染红色/染蓝色三个状态然后转移。一个新$trick$就是这里的转移只要考虑这个区间内的串是合法的就可以了
阅读全文
摘要:一个很妙的操作,求出每个点通过一条边可以向右边覆盖的最远距离,然后倍增。
阅读全文
摘要:前言 学到了一个$trick$。 对于一个组合数 $C_{x+y}^x$可以看成是从$(0,0)$到$(x,y)$的路径条数。 解法 对于这题而言,$C_{a_i+b_i+a_j+b_j}^{a_i+a_j}$就表示从点$(0,0)$到点$(a_i+a_j,b_i+b_j)$的路径条数。 ~~然后你
阅读全文
摘要:"Luogu P3703 [SDOI2017]树点涂色" 用LCT中每一个Splay维护颜色相同的点集,则从一个点到根节点的轻边的条数就是这个点的到根的权值。至于路径查询的搞个差分就好,用树剖实现。 至于为什么可以直接这样查,是因为LCT里面涉及子树的权值变化只有access函数。在splay中的子
阅读全文
摘要:```cpp #include #include using namespace std; #define R register #define LL long long const int inf=0x3f3f3f3f; const int MAXN=4e6+10; inline int read() { char a=getchar(); int x=0,f=1; for(;a>'9'||a=
阅读全文
摘要:```cpp #include #include #include #include #include using namespace std; #define R register #define LL long long const int inf=0x3f3f3f3f; const int MAXN=4e6+10; const double PI=3.14159265358979323846
阅读全文
摘要:"题目链接 BZOJ2568 比特集合" 思路 + 首先考虑不带区间加的情况,显然容易想到对每个数的每一个二进制位维护一个树状数组。设一个树状数组维护的是二进制的第$k$位,那就每次往里面存$num$的时候在这个树状数组的第$num\ mod \ 2^k$这个位置$+1$,那么我们最后查询的时候,只
阅读全文
摘要:丢个配置。。 编译 #!/bin/sh fullname=$GEDIT_CURRENT_DOCUMENT_NAME name=`echo $fullname | cut -d. -f1` g++ -o $name $fullname -DIN 运行 #!/bin/sh fullname=$GEDIT
阅读全文
摘要:前言 由于这篇题解思路并没有什么区别,所以这篇题解的意义在于稍稍更细致地讲下思路和卡常方法。~~估计也只有我常数这么大了~~ 思路 第一感 由于题目要查询到一个点距离为$k$以内的所有点的权值和,一个显然的想法就是对每个点开一个线段树维护权值和,下标维护距离,然后暴力查询。显然这是$MLE+TLE$
阅读全文
摘要:"这题正常的题面请看这里" ~~由大佬之言可知,看见网格图想分治~~ 所以这题考虑分治。 考虑把棋盘分成两半,那所有点就会有两种情况: + 在完整的一半以内 + 跨越两半 考虑在我们分成两半的那条中线的所有点跑最短路来更新所有点的答案。然后对于跨越了两半的点就直接保存答案,在同一块的点就类似整体二分
阅读全文
摘要:显然,一棵树的带权重心最多只有两个,最少会有一个,而且在这两个点的答案一定相等。(都是带权重心当然相等)鉴于点分治的写法貌似并不太需要这样的分析,就不说了。~~我不会~~ 首先建出一颗点分树,然后考虑在点分树上跳儿子来保证复杂度,于是我们就需要快速算出所有点到这个重心的带权距离和。~~由于这题是点分
阅读全文
摘要:计数性质 \(F_i=F_{i-1}+F_{i-2}\) \(\sum^{n}_{i=1}F_i=F_{n+2}-F_2\) 证明: 当$n=1$时,$F_3-F_2=F_1$显然成立。 当$n=2$时,\(F_4-F_2=F_3+F_2-F_2=F_1+F_2\),成立。 当$n=k-1$时,由公
阅读全文
摘要:动态点分治 先建出一颗点分树,然后维护。 对于每一个点维护两个堆,一个堆维护子树内所有点到分治父节点的距离最大值,一个堆维护一个点所有子树的第一个堆的最大值,再全局维护一个堆取所有分治重心的答案的最大值即可。 代码细节感人。。。 一个比较有用的trick就是用两个大根堆实现可删除的堆~~但是要开O2
阅读全文
摘要:数位DP 这题最妙的一点在于,由于我们无法存下原来的这个数,我们就考虑存取模之后的值,而这个模数就选择一个可能是最后的每一位数字的和的值。而这个总数只有$9 18=162$种,然后存下每一位的和以及从高位到低位的取模结果,数位DP即可。
阅读全文
摘要:前置知识 + 容斥原理 + 组合数 约定 $A'_i$表示集合$A_i$的补集。 反演形式 形式一 $$f(n)=\sum_{i=0}^{n}( 1)^iC^i_ng(i)\Leftrightarrow g(n)=\sum_{i=0}^{n}( 1)^iC^i_nf(i)$$ 证明 设$A_1,A_
阅读全文
摘要:看到异或最值,显然想到线性基。 用树上倍增的方法,维护当前点$x$到倍增父节点$fa[x][i]$这条路径上的线性基,在倍增的时候暴力合并即可。 注意这个线性基的倍增数组是没有包括最后一个点的信息的,需要特殊处理。然后就搞完了。 时间复杂度$O(n log_n log_v+q log_n log_v
阅读全文
摘要:其实如果这是一颗树的话很好搞,把$s$到$lca(s,t)$ 向上连,$lca(s,t)$到$t$向下连即可(然而事情并不是这样子的...)。 我们考虑什么样的情况是一定可行的呢?每两个点之间都有两条以上的路径,那就可以一边向前,一边向后,绝对可以。也就是求双联通分量以内是一定可以的,所以考虑缩点。
阅读全文
摘要:"原题传送门" 看见异或最值,估计线性基跑不了了。 考虑先随便提出一条从$1$到$n$的路径,这显然不一定是最优的,但是可以让它变强。比如可以让它中间插入一个环来让它变优。比如说有一条路径: $1 A B C N$ 可以补成: $1 A B E F G E B C N$ 注意到权值的变化其实就是多异
阅读全文
摘要:用处 没用我学这东西干嘛 快速查询一个数是否可以被一堆数异或出来 快速查询一堆数可以异或出来的最大/最小值 快速查询一堆数可以异或出来的第k大值 这么点? 还有点性质在下面 可能有点用 性质 原数列里的任何一个数都可以通过线性基里的数异或表示出来 线性基里任意一个子集的异或和都不为$0$ 一个数列可
阅读全文
摘要:线性基板子题,注意特判$0$,开$long~long$就好。
阅读全文
摘要:题目很显然就是要求序号的线性基。我们希望线性基里的权值最大,就按权值从大到小插入就行了。 为什么是对的呢?插入线性基的一个矿石只会和另一些矿石在一个位置上冲突,而那些矿石也只能插入这一位,同时它们价值不如当前的矿石,所以这是最优的。
阅读全文
摘要:Nim游戏的结论就是先手异或和不为0的时候必胜,所以就排个序,留下线性基就行了。
阅读全文
摘要:把每个对应的序列看成二进制数,能控制就把这一位设为$1$,那么每异或出来一个新的数就对应一种情况。 根据线性基的性质,任意一个子集异或和都不一样,所以直接线性基即可。
阅读全文