2025.4做题记录
qwq。
洛谷P4592 [TJOI2018] 异或
考虑建两颗可持久化 trie,一棵维护子树,一棵维护当前点到路径上的。
然后就没了。
洛谷P2680 [NOIP 2015 提高组] 运输计划
定义路径的权值是原树上路径的边权和。
考虑二分答案,二分到 \(mid\) 时删的边肯定是所有权值大于 \(mid\) 的交集。
把路径按权值从大到小排序后就是求前缀的交集。
可以树上差分,然后线段树合并维护经过当前点上面那条边的路径集,在树上二分预处理一下删当前边会影响前几条路径。
预处理后再把边排序一下,二分答案的时候直接在边的序列上二分,然后求前缀最大值就可以了。
洛谷P3168 [CQOI2015] 任务查询系统
把所有任务差分一下存到点上,然后用主席树维护,查询时拿两棵树减一下就行了。
洛谷P4216 [SCOI2015] 情报传递
预处理把每个 \(2\) 操作都放到点上后建点到根的主席树,操作 \(1\) 就变成了路径上权值小于等于某数的个数,用主席树搞一下就行。
洛谷P3521 [POI 2011] ROT-Tree Rotations
不难发现每次交换子树只有左右子树的逆序对会被影响。
考虑从下往上线段树合并,合并时算一下交换和不交换的逆序对数,取最小值加进答案里。
洛谷P5384 [Cnoi2019] 雪松果树
水体谁提水提。
把每个点的询问都挂到 \(k\) 级祖先上,就等价于子树里有多少个深度为某个数的问题。
显然用线段树合并随便做,然后就没了。
答案还要减 \(1\),因为不包含本身。
洛谷P3899 [湖南集训] 更为厉害
分讨一下 \(b\) 在 \(a\) 上面和下面的情况。
\(b\) 在 \(a\) 上面随便做就完了。
\(b\) 在 \(a\) 下面的话就相当于查询子树内深度在某个区间内的点的子树大小减 \(1\) 的和,线段树合并随便做。
洛谷P4197 Peaks
把查询离线下来然后按 \(x\) 从小到大排序。
然后考虑对这个图做 kruskal,加边的时候线段树合并。
做的时候开一个指针维护查询,如果把 \(\le x\) 的所有边都加上去了就在线段树上查一下。
注意是 \(k\) 大不是 \(k\) 小。
spoj20644 ZQUERY - Zero Query
回滚莫队板子题。
容易发现这题在序列前加一个 \(0\),做个前缀和,每次查询把 \(r\) 加一,就变成了洛谷上回滚莫队的板子。
洛谷P4269 [USACO18FEB] Snow Boots G
先考虑只有一个查询咋做。把每个 \(f_i > s\) 的位置设为 \(1\),其它设为 \(0\),如果最大子段和小于 \(d\) 就可以走。
多个查询时把查询按 \(s\) 排序,地砖按 \(f\) 排序,每次枚举查询时把 \(f > s\) 的地砖加进去。
单点修全局最大子段和,考虑使用线段树维护。
洛谷P3792 由乃与大母神原型和偶像崇拜
考虑对每个 \(1 \le i \le 2.5 \times 10^7\) 随机一个权值 \(rnd_i\)。
然后建一个线段树,维护区间最大值和区间 \(rnd\) 异或和。
查询的时候,设最大值为 \(m\),答案就是 \(\bigoplus\limits_{i=m-(r-l+1)+1}^{m} rnd_i\) 是不是等于区间异或和。
修改就是单点修。
洛谷P1712 [NOI2016] 区间
把区间按长度从小到大排序。
双指针,每次加区间的时候,给区间内的加一。
如果全局最大值大于等于 \(m\),就移左指针删区间,就是把区间内的减一,直到全局最大值小于 \(m\),然后把最后删的那一条加回来。
最后判断一下,如果当前的全局最大值大于等于 \(m\),就用右指针区间减左指针区间更新一下。