随笔分类 - 其他 - 思维题
摘要:新学了一下决策单调性. 对于这道题,我们可以先考虑 $j<i$ 的情况. 然后我们发现随着 $i$ 变大,$i$ 的决策点不可能减小(因为根号函数的增长速率越来越小,所以一旦被赶超上是不可能追回来的) 然后有两种处理方式:单调队列+二分 or 整体二分. 前者细节较多,后者更好写一些. code:
阅读全文
摘要:对于树边直接转移,然后按照套路拆环,在环上做一个单调队列 DP. 一种方案虽然在一个换上可能算不了,但是一定可以在另一个环上计算到. 仙人掌上 DP 的套路就是遇到树边就按照树上做,遇到环就拆环,做一个环形 DP. code: #include <bits/stdc++.h> #define N 2
阅读全文
摘要:第一道仙人掌题. 由于仙人掌中每条边最多只属于一个环,所以两个在环中的点的最短距离是好算的. code: #include <bits/stdc++.h> #define N 200006 #define setIO(s) freopen(s".in","r",stdin) using namesp
阅读全文
摘要:对于树的情况是简单的. 我们 DFS 这颗仙人掌,对于树边正常转移就行. 然后对于环,我们把环拿出来,然后强制讨论端点选/不选再跑一遍 DP 就行. code: #include <bits/stdc++.h> #define N 200006 #define setIO(s) freopen(s"
阅读全文
摘要:开始的时候没有借助圆方树去思考,思路非常混乱,想了很长时间后冷静下来发现这题不就是分类讨论简单题嘛... 题目不难,分两种情况讨论: 设当前点为中间点(圆点) 起点从一个儿子的子树进入到中间点后进入到另一个儿子的子树. 起点从一个儿子的子树进入到中间点后仍然回到该儿子子树中(相当于上一条的子问题)
阅读全文
摘要:一定注意,这里不要写错: $low[y]>=dfn[x]$,开始的时候把 $dfn[x]$ 写成 $low[x]$ 调了一下午...... 然后根据圆方树优美的性质,我们发现题中要求的就是圆方树上一些点构成的树链的并中圆点个数. 这个问题可以用虚树或树链的并解决. code: #include <c
阅读全文
摘要:圆方树模板题. 建出圆方树. 对于每个方点,只维护方点儿子的最小值,不维护方点父亲的值,这样的话每次修改只会改一个方点. 我们需要支持单点修改,链查询,求 lca. LCT 可以非常方便地维护这些东西,然后如果 lca 是方点的话特判一下方点父亲的点值即可,可以单独开一个命名空间以防止变量名冲突。
阅读全文
摘要:比较好想的建模题. 显然,如果选 $[l,r]$ 的话只要强制选 $[l,r-1]$ 与 $[l+1,r]$ 就行了. 然后 $m=0$ 的话直接在 $[i,i]$ 上扣掉编号大小就行. 如果 $m=1$,就套路的新建一个点,然后练一下限制的编号就行了. code: #include <bits/s
阅读全文
摘要:这道题是 KMP 来转移子串中的相对排名. 然后查询排名的话需要用到树状数组. 如果跳 fail 指针的话要把没用元素全部删掉. code: #include <bits/stdc++.h> #define N 1005000 #define setI(s) freopen(s".in","r",s
阅读全文
摘要:这道题太 tm 卡内存了. 不知道这样做意义何在,是在考察选手卡常能力吗 ? 思路没啥说的,整个棋盘的形态我们是知道的. 那么显然从小到大把数往棋盘里填,然后我们每次不可以选的是一个左下角和右上角区域,暴力覆盖就行. 覆盖的时候要判一下什么时候 break,来保证每个地方只被覆盖依次. code:
阅读全文
摘要:一眼吉司机线段树弱化版,但是这道题可以不用这么高级的数据结构. 直接用普通线段树,打一个 mx,mn 标记分别表示区间取 mn,max 然后 pushdown 的时候讨论一下大小关系即可. code: #include <bits/stdc++.h> #include "wall.h" #defin
阅读全文
摘要:暴力的做法是求出 $next$ 数组后倍增求解答案. 但实际上不用这么麻烦,再做一次类似于 KMP 的东西就可以了. code: #include <bits/stdc++.h> #define N 1000006 #define ll long long #define setI(s) freop
阅读全文
摘要:这道题好麻烦的. 把次小值和最小值一起更新,WA 了半天. 这道题采用的是势能分析的做法,并没有用到 CPU 监控那道题中的打标记法. 有时间再研究一下这几类线段树的异同. code: #include <cstdio> #include <algorithm> #include <cstring>
阅读全文
摘要:注意:在最小割轻易不要连流量为无穷大的双向边(这就意味着这两个点必须属于一个集合里了) code: #include <bits/stdc++.h> #define N 10005 #define I(s) freopen(s".in","r",stdin) #define O(s) freopen
阅读全文
摘要:最小割. 显然按位拆分,然后对于有矛盾的连流量为 1 的边,代表如果然不同颜色需要花费 1 的代价. 跑一个最大流即可. code: #include <bits/stdc++.h> #define N 560 #define ll long long #define setIO(s) freope
阅读全文
摘要:非常经典的最小割模型. code: #include <bits/stdc++.h> #define N 3006 #define ll long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; const l
阅读全文
摘要:这类最优化问题的本质是决策一个点选还是不选. 那么,我们可以用最小割帮我们决策到底选还是不选(因为最小割的本质是将元素划分成两个集合的最小代价) 然后每条边显然有断开的代价,描述出代价的关系和差量题就做出来了. code: #include <cstdio> #include <cstring> #
阅读全文
摘要:题意:有 $n$ 种牌,每种牌有 $C$ 张. 有两种方法能组成一叠: - $(i,i+1,i+2)$ - $(i,i,i)$ 一副牌是合法的,当且仅当这副牌能被分成若干叠. 给出牌的种类数 $n$ 以及每种的张数 $C$,和每种牌必选的个数.(如果该牌必选 $k$ 张,则有 $C-k$ 张是可选可
阅读全文
摘要:当相邻字母不相同的时候做法显然,相同的时候将相同区间提取出来,然后按照不同做就行. code: #include <bits/stdc++.h> #define ll long long #define N 1000006 #define setIO(s) freopen(s".in","r",st
阅读全文
摘要:碰到这种题第一反应就是找循环节. 我们发现我们就是要求 $a[i]+P \times k=b[i] ( \mod Q)$ 中 $P$ 的 k 的个数. 那么对于 $a[i]$ 来说,最大步数为 $\frac{T-1-a[i]}{P}$. 而我们发现 $a[i]+ P \times k$ 的循环节是
阅读全文

浙公网安备 33010602011771号