线段树&树状数组

小闸总的blog / 2023-08-16 / 原文

P4246

首先注意到两个点应该怎么联通,有可能直接走进去对吧,也有可能是绕一圈走过去,我们考虑整个在求连通性的时候最重要的是哪些点,是左上角,左下角,右上角和右下角,所以我们考虑维护他们之间的连通性。

然后连通性很好合并,所以我我们可以把这个东西搬上线段树维护一大段区间的四个角互相是否可达。

然后绕路的怎么办呢,对于前缀问能不能到达相邻点,再做往后的处理,先考虑绕左边再考虑绕到另一边去,两边连通性都出来了再考虑比较重要的两个点(起点和终点各自的相邻点)是否再能可达。

然后因为可达性的维护很容易,所以这个题实际上也是函数码出来了就基本上写完了。

CF757G

大码量狗屎

首先考虑不强制在线,不作修改应该怎么操作。

实际上这个题就是LCA那个题,可以直接离线掉做。

然后现在强制在线,怎么办呢,套主席树。

然后现在还要相邻的数交换,怎么办呢,考虑交换只会影响到这两个点,后面的取前缀和不关心顺序不变,前面的也不变,所以之际诶交换暴力重构主席树就行了。

不优美,时间复杂度是nlog2n的。

CF543E

考虑不强制在线怎么做,询问以权值排序,然后考虑排个序把点线段树上加进去就行了,像个弱智。

然后强制在线,套个主席树。

然后你看到这个畜生一样的空限。

你考虑优化,首先来个标记永久化,还不够,三个这么大的数组开不下。

然后这个题是怎么解决的呢。。。

你考虑lson和rson的数据范围大概是1<<23级别的,tag的数据范围大概是2e5级别的,我们认为他是1<<18级别的,然后我们发现这三个数可以拼成一个ULL,然后做法就是每个主席树节点有一个ULL,然后空间分成三份交给tag和lson和rson。

然后就卡过去了。

据说这题出题人非常想卡主席树但是还是没卡成,我决定还是。。。

写官方解法,不想拆位吃屎。

P4198

首先把他变成一坨斜率。

然后考虑两边区间怎么合并。

可以考虑递归,如果右区间的左区间的最大值比左区间的最大值还要大,那就是可以连,往下递归,右边的因为能钩上,所以考虑可以直接算贡献,否则直接往右边跑,然后做一次是log的,因为一次upd需要跑log次合并,所以upd是log2的。

然后是qry,考虑合并区间都给出来了那就直接做吧,没了,时间复杂度是nlog2n的。