蒟蒻日记_8月

8月开始了(其实咕咕好几天)
之前在学校宿舍里大摆烂


08-01


08-02

· 【模拟赛#2】A. 硬币

贪心

赛时做法:排序+固定成本后收益关于前 \(N\) 个的数量是一个单峰函数,三分~
正解:排序+双指针,可以贪心做

· 【模拟赛#2】C. 座位安排

线段树

直接上线段树维护一下区间最大连续段和最大前缀/后缀的连续段
赛时写挂痛失rk1

· 【模拟赛#1】C. 售货机

基环树

就是一个纯纯基环树的题,赛后一遍过。
总之熟悉一下基环树,之后大抵就不会碰到基环树害怕了。


08-03


08-04

· 【模拟赛#1】D. 字符串

DP

设计区间操作的题要考虑区间DP
除此之外判断一下字符集即可


08-05


今天回学校力


08-06

· 【线段树2】逆序对

归并排序

复健一下归并排序求逆序对

· 【线段树2】统计分数

线段树

区间RMQ+单点修改

· 【线段树2】火车线路

线段树

区间RMQ+区间修改
以及这题怎么还是语文题(恼

· 【线段树2】告示栏

线段树

寻找大于 \(val\) 的最小下标+单点修改,维护一下RMQ

· 【线段树2】酒店

线段树

区间最大连续段+区间修改

· 【线段树2】便签纸

线段树,扫描线

扫描线求周长
发现自己忘记了怎么不用lazytag
复健一下

打了一场模拟赛,300pts,如果D没有把操作数写成树的节点数就AK了
痛失AK啊啊啊啊

· 【模拟赛#6】 A.shuru

中位数

经典数学题,中位数搞定

· 【模拟赛#6】 B.tour

bitset

我万万没想到这题正解是bitset
这题主要是要判断三元环。
赛时以为是有 \(O(n^2)\) 的做法,然后写了一个 \(O(\frac{n^3}{\omega})\) 卡过,然后发现正解就是bitset

· 【模拟赛#6】 C.yggdrasil

换根DP

居然在赛时发明了换根DP这个东西
赛时觉得可以按照边来转移答案。
考完发现这玩意儿叫换根DP

· 【模拟赛#6】 D.watch

结论题

这个……emmm
题意极其模糊,出题人去死!!!
事实上是一个结论:一个点与给定范围的点的最深 \(lca\) 一定是 \(dfn\) 与之相邻的。


08-07

· 【块状链表】 【NOI2003】文本编辑器

块状链表

用STLrope氵过(?
这题读入好阴间

· 【模拟赛#7】 A.线段覆盖

贪心

gk是不是没题好出了……

· 【模拟赛#7】 B.结界

数学

经典糖果传递

· 【模拟赛#7】 C.神奇的整数

二分,枚举

直接枚举一个方向的线,然后二分答案,最终复杂度 \(O(2^nn^2\log n)\)

· 【模拟赛#7】 D.梦游仙境

BFS

直接大力模拟
以及老师居然在输出 \(-1\)\(\mathtt{31pts}\) 的情况下搬题忘记搬输出 \(-1\) 的情况了……


08-08

· 【平衡树】 普通平衡树

BIT

用离线+离散化+BIT+倍增来氵过平衡树的板子。
感觉十分良好~

· 【模拟赛#8】 A.填数游戏

模拟,数学

直接模拟,去除无用限制,算一下相邻点之间的最大值即可

· 【模拟赛#8】 B.积木塔

状压DP

直接状压DP即可。
然而事实上有更好的贪心方法,证明过程和国王游戏是差不多的。

大型颓废现场


08-09

·【树上问题】 巡逻

直径

首先 \(K=1\) 的情况只需要算一下直径。
这里还是很好想到的。
下面我试图使用基环树,但是没有注意到题目中添加的路只能走一遍的限制,因此没能搞出正解。
实际上, \(K=2\) 的情况只需要把上一次的直径上的边权赋为 \(-1\) 然后跑直径。

· 【模拟赛#9】 A.坚持到底

模拟,贪心

摩尔投票法
有字典序最小的限制导致其解法十分之ex

· 【模拟赛#9】 B.蚂蚁漫步

线段树

把蚂蚁经过 \(y\) 轴的时间段作为线段,然后区间染色。

· 【模拟赛#9】 C.围墙

双指针

可以枚举上下边和左边,右边可以用双指针维护。

· 【模拟赛#8】 C.旅游线路

DP

正解:排序边然后按照边DP即可。
我的奇怪做法:以边为点进行一个图的建,然后是一个DAG可以线性扫描达到DP的目的。


08-10

· 【动态规划】 多重背包

DP板子

· 【动态规划】 【普及组2019】纪念品

DP

主要还是一个把所有纪念品卖掉的贪心

· 【动态规划】 货币系统

DP

直接判断是否有一个面值可以被其他面值线性组合出来即可

· 【动态规划】 最长公共子序列

DP板子

· 【动态规划】 最长上升子序列

DP板子

· 【模拟赛#10】 B.跑步训练

线段树

两棵线段树维护一下即可

· 【模拟赛#10】 C.搬家

状压DP

显然可以枚举最后一个物品,然后从一个集合转移到另一个。

· 【模拟赛#10】 A.称职的司机

数学

我们注意到每次都是从一个终点跑到一个起点,因此我们可以贪心地把所以终点和起点排序,算相同下标的绝对值。证明用调整法即可。
这题主要还是得想到一定是终点到起点。

· 【模拟赛#10】 D.破案

缩点

首先跑Tarjan变成 \(DAG\)
然后就可以发现入度为 \(0\) 的点是一定要询问的。
设有 \(k\) 个入度为 \(0\) 的点,那么被杀掉的概率就是杀手在这 \(k\) 个点中的一个的概率。
答案为 \(1-\frac{n}{k}\) 。然而我们可以排除法排除掉一个孤立点,因此还需特判。


08-11

· 【动态规划】 棋盘染色

状压DP

典型状压DP,直接预处理合法的相邻行即可

· 【动态规划】【NOIP2017提高组】宝藏

状压DP

好题!!!
首先一个很好的想法:按照高度一层一层DP。
这个事情可以去枚举子集来做。
这个时候就可以发现 \(n\le 12\) 是可以做到 \(O(3^n)\) 枚举子集的。
而转移的时候我们需要算出一个代价函数,假设 \(dp(S,h)\) 代表集合为 \(S\) 且高度不超过 \(h\) 的情况。应当有

\[dp(S,h)=\min_{S'\in S}\left\{dp(S',h-1)+w(S',S/S')\cdot h\right\} \]

而我们会发现 \(w(S',S/S')\) 是可以预处理的。
更进一步地有

\[w(\{v\}\cup S,S')=w(S,S')+\min_{(u,v,c),u\in S}\{c\} \]

从而我们就可以 \(O(3^nn)\) 预处理并 \(O(3^nn)\) 转移。

· 【模拟赛#11】 B.上司们

BFS,思维

我们把答案转化为 \(\sum{dis_i}\)
于是我们枚举根节点,并bfs出 \(dis\) 数组,统计答案即可。

· 【模拟赛#11】 A.录像机

贪心

没错是可以贪心的。直接按照右端点排序,一个一个塞入即可。
这种贪心题主要还是要大胆猜测!

· 【模拟赛#11】 C.划分多边形

计算几何,DP

死在DP上。首先利用我们的解析几何基本功计算几何可以算出每条边时候可以连接,然后破环为链,区间DP即可。然后我发现我忘记枚举中间点,而是只考虑旁边的点,痛失10pts

· 【模拟赛#11】 D.滑雪场

并查集,贪心

我们可以从小到大枚举边,用并查集维护可以达到的点。
然后对大小大于 \(t\) 的集合,我们不再将它与其他集合合并,而是在合并的时候再其他集合上打上标记。


08-12

· 【树上问题】 社区小组

我的奇怪暴力解法:
根 号 分 治
设第 \(i\) 组有 \(k_i\) 人。
\(k_i>\sqrt n\) 的时候 \(O(n)\) 求出子树的直径,此时均摊到每个组员的复杂度是 \(O(\frac{n}{\sqrt n})=O(\sqrt n)\) 的。
然后在 \(k_i \le \sqrt n\)的时候两两用欧拉序 \(O(1)\)\(lca\) 算距离,此时均摊到每个组员的复杂度也是 \(O(\sqrt n)\) 的.
然后总复杂度 \(O(n\sqrt n)\)
经过大量卡常通过了(

· 【模拟赛#12】 A.连通图

并查集

倒着做一遍,判断集合个数是否为 \(1\) 即可。

· 【模拟赛#12】 D.均衡III

树状数组

首先二分答案。
然后从下至上枚举与 \(x\) 轴平行的边,期间用树状数组分别维护两块某一个 \(x\) 坐标上的总和。然后我们记使得上半部分前缀和不超过 \(ans\) 的最大下标为 \(p1\) ,下半部分为 \(p2\) 。我们只需要令 \(a=\min\{p1,p2\}\) 再用树状数组判断即可。
而怎么求 \(p1\)\(p2\) 呢?
我们会发现,\(p1\)\(p2\) 随着 \(b\) 的变化是有单调性的,因此可以直接均摊 \(O(1)\)
就这样 \(O(n\log n)\) 做完了。

而我的做法则是 \(O(n\log^2n)\) 的,是因为先枚举 \(b\) 再二分,这样没有单调性,就只能倍增求 \(p1\)\(p2\) 了。虽然通过了,但是还是要吸取教训,就是这种枚举+二分的,要把多个顺序都考虑到,因为有些性质会随着顺序的改变而改变。

· 【模拟赛#12】 B.盛装游行

树形DP

直接贪心地配对叶子即可。

· 【模拟赛#2】 B.二叉树

DP,括号序列

好题!!!
这题我们需要一个东西来方便地表示有不超过 \(m\) 个左向边这件事情,同时需要一个快速的转移。
而直接把二叉树的左向边是无法达到快速转移的目的的。
我们会发现,一个二叉树可以转化为括号序列,即把左向边变成 '\((\)' ,右向边变成 '\()\)' 即可。
那么注意到左向边个数其实就是括号串形成过程中未匹配的左括号的数量。这个是可以方便转移的。

· 【模拟赛#12】 C.不要混淆

KMP,DP

好题!!!
首先看到数据范围容易想到去设计一个状态 \(dp(i,j)\) 表示 \(s\) 的前 \(i\) 位匹配了 \(t\) 的长度为 \(j\) 的后缀。
然后我们发现这个转移并不容易,而且我们为了保证答案方便统计,得要把状态设计为匹配的长度最大为 \(t\)
正难则反,我们考虑对一个状态计算其能够转移到的状态。而且我们发现可以转移到的长度只和下一个字符有关。
因此我们可以考虑预处理出一个函数 \(nxt(i,c)\) 其中 \(c\in\{a,b,\cdots,z\}\) 表示长度为 \(i\)\(t\) 的前缀加上 \(c\) 后最大的匹配前缀长度。这个可以利用KMP进行一个快速的 \(O(|\{a,b,\cdots,z\}|\cdot m)\) 的计算。

感觉学了半天最蒻的还是DP。开学得好好刷刷算进的DP章节了。


08-13

· 【哈希】朋友

哈希

直接暴力枚举去掉的字符用哈希判断是否可行即可。

· 【哈希】企鹅QQ

哈希,散列表

暴力枚举不同的位数,然后每个都跑一遍哈希。

然后一个散列表清空的trick:设计一个 \(vis\) 和一个 \(id\) ,如果当前访问到的表 \(vis\) 的值不等于 \(id\) 则代表需要清空,并把 \(vis\) 赋值为 \(id\)。相当于每次访问打一个标记,代表这是第 \(id\) 次清空后的操作。

这题怎么还卡空间啊
这题怎么还unsiged自然溢出啊

· 【哈希】双旋转字符串

哈希,散列表

可以暴力枚举每个 \(S\) 中元素旋转的次数,这样整个字符串就确定了。然后计算哈希值后在散列表中查询有多少个可以匹配的 \(T\) 的元素即可。

· 【哈希】小C找朋友

哈希,散列表

显然是要比较出度集合。
这个可以用散列表快速维护。
问题是如何设计哈希函数。
我们有一个自然的想法:将出度的标号排序,然后用类似字符串哈希的方式去计算。
然而我们会发现我们对本身就已经连接的两个点还要做特殊处理,因为一个点的出度集合不会包含自己,而直接包含自己又会导致无法统计和自己。
因此我们可以分类讨论,一种记录包含自己的,一种记录不包含自己的。并且容易发现这两种是不会冲突的。这样就做完了。

· 【模拟赛#13】 B.数字合并游戏

区间DP

直接区间DP即可

· 【模拟赛#13】 A.密码锁

容斥

维护一下每一位可选的范围,然后容斥做即可
记得开long long啊啊啊啊啊啊啊啊啊啊

· 【模拟赛#13】 C.周长

思维

奇妙思维题
想法是尽可能扩大 \(A\) 的范围,然后就是一个线性的做法。
这之中有不少细节是要注意的。

考虑目标点的几种情况:

  1. 当前点周围有三个 \(A\) 或四个 \(A\) 时:这个点肯定不会走到,直接用 \(A\) 填上。

  2. 当前点夹在两个点中间,无法判断这个点被填上后是否会让两边出现独立的 \(x\) ,所以跳过该点,之后如果某一边被填满,会导致这个点被重新搜到,那时再考虑。

  3. 当前点被两个相邻的 \(A\) 夹在一起,且当前点填上时周围八格没有任何 ,那么直接填上。

  4. 当前点被两个相邻的 \(A\) 夹在一起,且当前点填上时周围八格有 \(x\) 或对角有一个 \(A\) 那么这个点肯定会被经过,因为无论往外怎么伸展,最后必须从这里过去以绕开那个 。

  5. 当前点周围有一个 \(A\) 或没有 \(A\) ,那么这个点先不管,等会也可能再次搜到。

然后还有一个好玩的结论:每个点被经过次数是其八连通中 \(A\) 的块数。
然后就可以做到 \(O(NM)\) 统计了。
总的来说,这题并不很有拓展性,思维上的锻炼是重点。


08-14

· 【分块/莫队】 数列分块入门-1

分块

分块板子,配合hzwer的题解食用十分舒服。

· 【分块/莫队】 数列分块入门-2

分块

同上(

今天的模拟赛好清新

· 【模拟赛#14】 A.矿场地震

贪心

我们注意到一个点如果不能到达,我们可以把它直接人为炸掉(什
所以我们可以把一个不能到达的点及其领域全部炸掉
而注意到这样已经满足了要求,贪心部分就结束了。

· 【模拟赛#14】 B.长方形切分

枚举

注意到两个长方形没有交点,因此一定有一条与 \(x\) 轴或 \(y\) 轴平行的直线将两个长方形分开。
枚举那条直线即可。

· 【模拟赛#14】 C.赛跑

DP

注意到距离的值域十分的小,因此考虑对答案DP
\(dp(i,j)\) 表示到达 \(i\)\(j\) 时间是否可达,转移为 \(dp(v,j)=\mathop{\Large\or}\limits_{(u,v,c)\in E} dp(u,j-c)\)

· 【模拟赛#14】 D.游戏

DP

高维DP。这题和第一次模拟赛极为相似,只不过这次我们无法通过字符串长度得到消去后得到的字符串是哪个字符串的多大长度的前缀。
因此我们多加两个维度,令 \(dp(i,j,k,t)\) 表示区间 \([i,j]\) 是否可以被消为 \(s_k\) 的长度为 \(t\) 的前缀。此外我们需要用 \(dp(i,j,0,0)\) 来表示 \([i,j]\) 是否能够被完全消掉。
然后转移有两种情况。

  1. \(s_k[t]=w_j\) ,我们可以直接由 \(dp(i,j,k,t-1)\) 转移。
  2. 我们有 \(dp(i,j-x,k,t)=1\)\(dp(j-x+1,j,0,0)=1\) ,也可以转移。

注意到第一种的转移是 \(O(|w|^2\sum|s_i|)\) 的,第二种是 \(O(|w|^3\sum|s_i|)\) 的。
同时我们注意到只要 \(dp(j-x+1,j,0,0)=1\) 那么我们可以直接把 \(dp(i,j-x,k',t')\) (其中 \(k',t'\) 为任意合法值) 直接转移到 \(dp(i,j,k',t')\) ,这可以用bitset批量处理。
由于最后一维十分之小,复杂度降至 \(O(|w|^3n)\) ,可以通过。

· 【洛谷】「GLR-R3」立春

结论

显然有答案为 \(\prod\limits_{i=1}^{n}(2^n-1)\)


08-15

· 【模拟赛#13】 D.兼职

树状数组,二进制

我们有一个结论, \(x\) 二进制下第 \(k\)\(x_k=[x\mod2^{k+1}\ge2^k]\) ,因此可以利用这个对每个 \(k\) 建立BIT,达到查询的目的。同时,我们对将每个数加 \(x\) 用类似“职员”那题的方法处理即可。


08-16

· 【分块/莫队】 数列分块入门-3

分块

分块板子,配合hzwer的题解食用十分舒服。

· 【分块/莫队】 数列分块入门-4

分块

同上(


08-17

· 【分块/莫队】 数列分块入门-5

分块

分块板子,配合hzwer的题解食用十分舒服。

· 【分块/莫队】 数列分块入门-6

块状链表

用STLrope氵过。

· 【分块/莫队】波动

分块

也是区间加+查询区间不小于 \(c\) 的,和分块入门-2一样的。


08-18

· 【分块/莫队】蒲公英

分块

神仙分块题。
一个好的想法就是:
所有连续的整块的信息通常可以 \(O(n\sqrt n)\) 预处理。
这题里面预处理出连续整块的众数,然后再暴力枚举在散块内的元素。

· 【分块/莫队】至少重复三次的数字

分块/莫队

两种做法都有。因为离线可以莫队维护。
而分块则和上一题一样,维护连续整块信息即可。


08-19

这次月赛属于是纯纯信心赛了。

· 【8月月赛】 Div1.A 双端队列

枚举

原题……

· 【8月月赛】 Div1.B 推理

并查集/DFS

一眼连通块,然后用并查集或DFS计算即可,都是差不多 \(\mathcal{O}(n)\)

· 【8月月赛】 Div1.C 公共子序列

DP

\[dp(i,j)= \begin{cases} dp(i-1,j)+dp(i,j-1)&,s_i=t_j\\ dp(i-1,j)+dp(i,j-1)-dp(i-1,j-1)&,s_i\ne t_j \end{cases} \]

· 【8月月赛】 Div1.D 等差数列

矩阵快速幂,递推

算是老题了(?

\[\begin{bmatrix} ans&a+kb&1 \end{bmatrix} \times \begin{bmatrix} 10^t&0&0\\ 1&1&0\\ 0&b&1\\ \end{bmatrix} = \begin{bmatrix} 10^tans+a+kb&a+(k+1)b&1 \end{bmatrix} \]

做到递推的效果,然后分 \(t\) 的大小进行矩阵快速幂
复杂度事 \(O(\log^2n)\)
然而我赛时电脑寄了,没时间查出一个取模的错误(没过样例)
痛失AK~

posted @ 2022-08-07 10:48  思考人生中…  阅读(37)  评论(0编辑  收藏  举报