完成情况
为什么全是傻逼码农题啊!!1
题解
A. 震波
先来胡一波题解
看到距离不超过 (k) 我们可以考虑用点分树来做。对于点分树上的每个点考虑建立一棵线段树存其子树内的信息。线段树上的每个叶子节点 ([x,x]) 代表到这个点距离为 (x) 的点的权值和。
然后发现我们要求的是前缀和所以树状数组就好了(可见我刚是多么傻逼)。
但是这样不能统计到所有答案,考虑点分树常见套路:跳父亲。由于点分树的性质树高是 (log) 的所以复杂度还是对的(话说复杂度对的是什么意思啊)。跳父亲的时候直接容斥一下就好了,所以要再维护一个树状数组。
对于修改就暴力跳父亲就好了。
突然发现要动态开点所以树状数组又不行了(md,我就是傻逼)。
写的时候注意常数(lca要写O(1)lca)
B. AtmCDW的树
看到这题时限被瞎了一跳,感觉又要被卡常了
同上,这篇题解还是口胡
大概想了2个算法,估计只会实现最简单的那个。
算法1
首先考虑对于每个点二分答案,然后再点分树上类似 A 的查询即可。
时间复杂度是耻辱的 (O(nlog^3{n}))。
算法2
考虑对每个点直接维护权值线段树,然后换根。实现用线段树合并即可。复杂度未知。((O(nlog{n}))不会证)。
又想了想大概是对的,和普通的线段树合并相同,不过要把没用的节点回收,要写内存回收,比较麻烦。
C. Attack
艹为什么我又只会 (O(nlog^3{n})) 的做法啊。具体就整体二分,然后套cdq,对于修改就再给点赋个权值。
感觉要被卡常啊?哦时限3s那没事了。看了眼题解,怎么都是 (O(nlog^3{n})) 啊。
注意这题是相对顶点,也就是说不保证左右下上角,这时我直接取两者较小和较大值作为左下角和右上角即可。
D. 布娃娃
说句闲话:这道和cyx(zs)有关的题是不是应该毙掉啊
看起来这个贡献和查询的无关的,那么直接分开即可。第一感觉就是线段树套平衡树,但是复杂度好像 (O(nlog^2{n})),啊好对啊。
但是我们都知道树套树的题可以用离线分治来做,这题也一样。考虑整体二分,然后线段树查询就好了。艹,用个鬼的线段树,直接树状数组就好了。
艹等等,它是反的啊。我果然是傻逼。
反的话就考虑拆区间然后扫描线扫一扫?然后还整体二分你码呢,直接套一个平衡树(pb_ds)就好了。
艹pb_ds好多要注意的事啊。(以后专门写一篇博客记录一下pb_ds用法)。
E. 稻草人
一个垃圾2log做法,跑得贼慢。
首先切入点很容易想到是第二个条件,我们按 (x) 排序后枚举两个点即可做到 ( ilde{O}(n^2)),判断就用个树状数组 (O(log{n})) 做。考虑分治。cdq的时候左部点作为左下角,右部点作为右上角,分治的时候因为已经保证了 (x) 有序,再按 (y) 排序就有单调性了,这时我们分别从小到大枚举左部点 (i) 和右部点 (j),考虑对于每个 (j) 在所有 (y(i)<y(j)) 的 (i) 里求答案,发现要满足在所有 (y(j')<y(j)) 且 (x(j')<x(j)) 的 (j') 里要求 (y(i)>max y(j')),那么这里用树状数组先求出 (max y(j')),再用二分求出第一个大于其的 (i) 的,我们发现对于 ((i_1,i_2)),若 (x(i_1)<x(i_2)) 且 (y(i_1)<y(i_2)) 那么 (i_1) 就是没意义的的,所以我们考虑用单调队列(栈)来维护,在其上二分即可,最后复杂度 (O(nlog^2{n}))。
F. 纸箱堆叠
看到这个要求其实是个三维偏序,而对于一组子集其实就是个lis。那么我们直接求三维lis就好了。sb板子题。
G & H
这两题都是zzq凉心赛题,详情见 ZZQ省选凉心赛。
密码是考试的日期。