随笔分类 - 其他 - 模型/总结/重要
摘要:由于有重复数字,所以这个问题就很不好处理. 考虑我们让 $i$ 为根,这个点对答案的贡献就是以 $i$ 为根,由 $val[i] \leqslant val[j]$ 的 $K$ 个点组成的连通块个数. 但是我们会发现如果直接求的话会算重一部分. 如果 $val[j]>val[i]$ 的话,将这个点设
阅读全文
摘要:这算是决策单调性入门题吧. 我们很容易发现 $f[i]$ 的转移 $p_{i}$ 满足单调性,然后拿单调队列来维护就行. 对于队列中每个元素维护这个元素转移区间的右端点 新加入一个点的时候和队尾比较一下,看队尾是否会被覆盖,弹掉无用元素. code: #include <bits/stdc++.h>
阅读全文
摘要:嘴巴上把这道题切了,但是写代码的时候好多细节都需要注意. 1. 大概可以猜到能表示出的数字比多,但是这一步要用 BFS+hash 才行,因为用 DP 求解的话会有好多无用状态. 2. 做动态规划的时候如果对与状态有限制条件的话比较好写的方法是由合法状态去转移下一步,而不是枚举当前状态去找上一步的状态
阅读全文
摘要:新学了一下决策单调性. 对于这道题,我们可以先考虑 $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
阅读全文
摘要:Description 维护一个长度为N的序列a,现在有三种操作: 1)给出参数U,V,C,将a[U],a[U+1],...,a[V-1],a[V]都赋值为C。 2)给出参数U,V,C,对于区间[U,V]里的每个数i,将a[i]赋值为max(a[i]+C,0)。 3)给出参数U,V,输出a[U],a
阅读全文
摘要:和 cpu 监控用的是一种做法. 令 $(a,b)$ 表示加上 a,再与 $b$ 取 max. 则 $(a,b)$ 与 $(c,d)$ 的历史最值合并可以看作是两个函数的合并,只需在 $(a,c)$ 中取一个 max,$(b,d)$ 中也取一个 max 即可. 仔细考虑一下标记的时间顺序:如果使用取
阅读全文
摘要:$(x,y)$ 表示加完 $x$,再对 $y$ 取 max 的操作. 那么有 $(a,b)+(c,d)=(a+c,max(b+c,d))$ 然后对于两个标记取 max 的话是 $(max(a,c),max(b,d))$ 知道这些之后就好做了. 一定要注意:先更新历史最值标记,然后再更新当前最值(因为
阅读全文

浙公网安备 33010602011771号