随笔分类 - 算法
摘要:比较神仙的随机化+交互题. 测试点 $1$ ~ $5$ : 限制条件不强,可以直接点亮一条边中编号小的点 $x$,然后再枚举编号大于 $x$ 的点. 操作次数:$O(n)$ 查询次数:$O(n^2)$ 测试点 $6$ ~ $9$: 图的形态是点两两匹配. 这里有两种做法: 1. 随机化 假设当前要分
阅读全文
摘要:双指针+LCT. 在二分图那道题中,有一种用 LCT 维护奇环的方法. 该题的做法和那道题相似. 对于 $i$,维护 $left[i]$ 表示当删除 $i$ 时最靠左的端点使得删掉 $[left[i]+1,i]$ 后仍然存在奇环. 那么最后判断答案的时候就看 $(l,r)$ 中的 $l$ 是否大于
阅读全文
摘要:题意:求有多少种排列满足 $i$ 之前第一个小于 $i$ 的位置是 $q[i]$. 如果没有 $q[i]$ 的限制,答案就是全排列,然后 $q[i]$ 会限制一些元素之间的大小关系. 直接做的话没办法方便地求出元素之间的大小关系. 不妨思考单调栈的过程:如果遇到前缀最小值的话肯定会将栈清空. 那么也
阅读全文
摘要:怎么想都没想出来 $\log n$ 做法,那么这道题基本就是根号分治了. 题目描述中保证 $\sum k \leqslant 10^5$,然后 $k$ 在每次询问中又是相同的,那么就考虑对 $k$ 根号分治. 先对 $s$ 建立后缀自动机,然后把倍增数组求出来. 我们设块的大小为 $B$,那么当 $
阅读全文
摘要:手画一下发现最优策略是统一向左/向右移,那我们就让鞋子向左移. 因为一个鞋子向左移不会使右面的答案变差,而最左面没有被匹配的鞋子也迟早要和一个鞋子去匹配. 写了一个 $O(n^2)$ 的暴力,过掉了 50pts. 然后我们发现将鞋子从 $j$ 移到 $i$ 的代价是 $j-i-$ $[i,j]$ 中
阅读全文
摘要:刚开始想的贪心是先删掉儿子数量多的. 但是如果一棵树有一条特别长的链的话这个贪心就假了. 换一种贪心思路:优先删掉子树深度大的. 这种贪心题的证明也不会了,感觉没啥反例就当正确了. 以后做贪心题的时候还是要多手造几组数据,验证正确性. 希望正式考试能少出这种贪心(出的话大样例一定要足够强) code
阅读全文
摘要:二分最大值,然后考虑如何处理. 正着做很难,因为每次减掉 $p$ 后还要与 0 取 max,但是倒着做就会容易很多. 先将所有数的高度都置为 $mid$,那么就有两种操作: 1. -a[i] 2. +p 显然每次减掉 $a[i]$ 后不可以小于 0,因为如果减掉 $a[i]$ 后小于 0 的话意味着
阅读全文
摘要:这道题有 3 个操作: 1. 换根 2. 求 LCA 3. 子树修改/子树求和. 对于第一个操作,直接换根就行. 对于第二个操作,分这几种情况讨论:$x,y$ 都在以 1 为根,$rt$ 的子树中,$x,y$ 其中 1 个在子树中,$x,y$ 都不在子树中. 对于都在子树中的情况,答案即为 $lca
阅读全文
摘要:归纳+找规律. 如果终点 $r$ 是奇数,那么 $r-m-1$ ~ $r-1$ 这段区间都是先手必败. 然后我们发现 $r-m-1$ 及之前都是偶数的话还是先手比败,直到遇到一个奇数,就又变成了先手必胜. 那么,对于一个奇数位置,其前面第一个先手必胜位置就是 $r-m-1$ 前第一个奇数位置. 对于
阅读全文
摘要:比较好的一道贪心题. 有 3 种操作: 1. 对一个位置赋值. 2. 对一个位置进行加法. 3. 对一个位置进行乘法. 显然,如果想让结果最大,顺序一定是 1,2,3 即先赋值再加最后乘. 3 种情况同时存在不好比较,那么考虑将所有操作都转换成乘法. 假设一个操作加了 $x$,另一个操作乘了 $y$
阅读全文
摘要:题意:给定一个排列,每次有两种操作:1 区间降序排列 2 区间升序排列,求 m 才操作后 q 位置上的数字 这道题非常神仙啊. 假如说序列中只有 0,1 的话我们只需要用线段树维护 0,1的个数然后进行区间覆盖即可. 由于所有数互不相同,考虑二分 $q$ 点上的数 $mid$,然后将大于等于 $mi
阅读全文
摘要:我之前一直以为这道题很厉害,没想到就是一个整体二分模板题,就当省选前练练手了. 我们计算每个木棍是被哪个子弹所击碎的,然后这个显然具有单调性. 每一条木棍分别去二分答案的话时间复杂度大概是 $O(n^2 \log n)$ 的. 所以我们就采用整体二分的方式,然后判断的话用一个树状数组来一个区间加法就
阅读全文
摘要:朴素的矩阵乘法时间复杂度会爆炸,但是我们发现矩阵乘法的形式是一个 $(1 \times n) \times (n \times n)$ 的形式. 所以如果提前预处理出来 $(n \times n)$ 矩阵的 $2^i$ 次幂,然后每次询问的时候二进制拆分,复杂度就是 $O(n^2 \log 1e9)
阅读全文
摘要:一共有 60 次询问机会,显然可以用 30 次来确定序列的最大值(二分) 然后再用 30 次随机获得 30 个位置的值,那么有 $a_{j}=a_{i}+k\times d$,($d$ 为公差) 那么 $d$ = $gcd(d1,d2,d3,....dn)$,故将 30 个数排序,然后求一下两两之间
阅读全文
摘要:脑残了,这题竟然都不会. 显然,把所有左右端点放在一起排序,然后取中位数是 $k=1$ 时最优的. $k=2$ 的时候显然距离中点越近越好,所以将中点扔进去,然后枚举中间的分割点,分割点左右就变成两个子问题了. 动态求中位数的话用平衡树/权值线段树维护就行了. code: #include <bit
阅读全文
摘要:显然,对于一条边的两个端点必须选择一个;对于一个块内的点,只能选择一个. 第一种限制好满足,第二个限制的话前/后缀和优化一下建图就行可. code: #include <bits/stdc++.h> #define N 4000009 #define ll long long #define set
阅读全文
摘要:后缀自动机的做法很显然:建出后缀树,线段树合并,然后倍增的时候更新答案就行. 后缀数组的做法也挺显然:二分答案,然后用主席树判定一下 $[a,b-mid+1]$ 是否有值即可. code: #include <bits/stdc++.h> #define N 200006 #define lson
阅读全文
摘要:我不明白这道题第二问到底在说啥...... 第一问比较简单,直接用 set 来贪心就行了. 然后我感觉第二问就是求一个最大独立集就行. 套路:都 0202 年了,看到最优化就要上随机化呀!! code: #include <bits/stdc++.h> #define N 10008 #define
阅读全文
摘要:第一次做交互题,感觉挺有趣的. 对于链的部分,可以随机一个点拓展,直到拓展到该点为止. 但是最坏情况下可能每次都要询问两次(每次左右端点都选错). 据说随机化情况下出错的次数大概为 $O( \log n)$ 次. 对于树的部分最暴力的做法是从根节点开始询问,暴力拓展到叶子. 假设钦定一条从根节点向下
阅读全文
摘要:这算是决策单调性入门题吧. 我们很容易发现 $f[i]$ 的转移 $p_{i}$ 满足单调性,然后拿单调队列来维护就行. 对于队列中每个元素维护这个元素转移区间的右端点 新加入一个点的时候和队尾比较一下,看队尾是否会被覆盖,弹掉无用元素. code: #include <bits/stdc++.h>
阅读全文

浙公网安备 33010602011771号