2025.7做题笔记

qwq
洛谷P8037 [COCI 2015/2016 #7] Prokletnik
好题。
考虑离线下来,把询问挂到右端点上跑扫描线。
可以先处理左端点为最小值,右端点为最大值的情况,然后把 \(a_i\)\(-1\) 再跑一遍。
设当前跑到 \(r\),可以发现区间的左端点一定要满足 \(a_l \le a_r\),可以用单调栈处理出左端点能取到的最小值。
可以发现,区间的左端点还要满足 \(a_l = \min\limits_{l\le i\le r}a_i\),可以用另一个单调栈找出不合法的。
用线段树维护区间内合法的最左的点、区间能取到的长度的最大值和懒标记。
洛谷P2480 [SDOI2010] 古代猪文
可以用欧拉定理把 \(g\) 去了,最后再快速幂回来,所以只用算指数。
\(\varphi(999911659)=999911658\),显然这不是质数,太坏了!注意到 \(999911658=2\times3\times4679\times35617\),可以算出对这四个质数取模后的结果,然后用 CRT 合并。
发现模数并不大,可以枚举 \(n\) 的因子,然后 lucas 定理算 \(\binom{n}{d}\)
P2056 [ZJOI2007] 捉迷藏
黑点是关灯的点,白点是开灯的点。
考虑对于一个黑点集合 \(S\),如何计算出它的答案。
可以从集合里一个个加点。设 \(u,v\) 是当前距离最远的两个点,\(x\) 是要加进来的这个点,根据直径的性质可知,答案一定是 \(\max\{dis(u,v),dis(u,x),dis(v,x)\}\)
对每个点处理出它是黑点的时间段,插到线段树里然后线段树分治,用栈维护撤销操作。
CF543D Road Improvement
显然换根。
先随便找个根跑一遍。设 \(f_u\) 表示 \(u\) 子树的答案,有 \(f_u=\prod\limits_{v\in son_u}(f_v+1)\)
\(g_u\) 表示以 \(u\) 为根的答案,有 \(g_v=f_v\times (\frac{g_u}{f_v+1}+1)\)
交上去后,邪恶的出题人会在第十个点卡掉你并告诉你 \(0\) 没有逆元,所以要特殊处理。
因为这个我调这题调了 3h,qswl。
CF1009F Dominant Indices
长链剖分板子,虽然我第一眼想到的是线段树合并。
记录子树中距离根的每个距离有多少个点。
搜到一个点时,把他的重儿子的信息转移过来,然后枚举子节点暴力合并信息,合并的时候更新答案。
ARC101E Ribbons on Tree
容斥。
把没染色的边看成断掉的。设 \(g_i\) 表示大小为 \(i\) 的联通块的配对个数,不考虑联通,有 \(g_i=g_{i-1}\times(i-1)\),显然 \(i\) 要是偶数。
\(f_{u,j}\) 表示 \(u\) 的子树内,\(u\) 所在的联通块的大小为 \(j\) 的配对个数(不考虑 \(u\) 的联通块),答案为 \(\sum\limits_{i=1}^{n}f_{1,i}\times g_i\)
\(v\)\(u\) 的子节点,考虑枚举 \(u\) 联通块大小 \(i\)\(v\) 联通块大小 \(j\)\((u,v)\) 这条边断不断。有:

\[f_{u,i}\gets f_{u,i}\times f_{v,j} \times (-g_j) \]

\[f_{u,i+j}\gets f_{u,i}\times f_{v,j} \]

洛谷P7961 [NOIP2021] 数列
\(dp_{i,j,k,p}\) 表示确定了 \(S\) 的前 \(i\) 位,确定了 \(a\)\(j\) 个位置,\(S\)\(i\) 位有 \(k\)\(1\),从上一位进位 \(p\) 个(\(S\) 最低位为 \(0\))。
枚举有 \(t\)\(a\)\(i\),有转移 \(dp_{i+1,j+t,k+(p+t)\bmod2,\lfloor\frac{p+t}{2}\rfloor}\gets dp_{i,j,k,p}\times v_{i}^{t}\times \binom{n-j}{t}\)
洛谷P1368 工艺
把串串复制一遍拼到后面。设 \(f_i=s[i:i+n-1]\),要求的就是 \(\min\limits_{i=1}^{n}f_i\)
直接二分哈希就行。
洛谷P3963 [TJOI2013] 奖学金
水题,感觉能降黄(??
按成绩从小到大排序,枚举中位数,看取到这个的最小价值是不是小于等于 \(f\)
最小价值显然是 \([1,i-1]\)\([i+1,n]\) 各取最小 \(\lfloor\frac{n}{2}\rfloor\) 个的和,再加上自己。
可以用大根堆预处理。
洛谷P6240 好吃的题目
猫树分治板子。
猫树的结构类似于线段树,通过处理 \(\forall i\in [l,mid],f(i,mid)\)\(\forall i\in (mid,r],f(mid+1,r)\),来计算出跨过区间中点的询问的答案,时间复杂度为 \(O(n\log nT+qT)\)\(T\) 为合并答案的复杂度。
猫树分治是把询问离线下来,预处理猫树的时候直接把查询做了。
这道题就是套个背包,然后没了。
qoj9492 树上简单求和
神题。
\(T_1,T_2\) 表示第一第二棵树。对两棵树树剖,就能把链拆成 \(O(\log n)\) 个连续的 \(dfn\) 区间。
转化成 \(O(q\log n)\) 次区间修区间查。区间修 \(\forall i \in [l,r],a_{p_i}\)\(k\),区间查区间和。\(p_i\) 表示 \(T_1\)\(dfn = i\) 的点在 \(T_2\)\(dfn\)
对两棵树的 \(dfn\) 分块,维护 \(T_2\) 的每个块对应的 \(a_i\) 的和,\(T_1\) 每个块对应的点的 \(p\)\(T_2\) 的前 \(j\) 个块出现了几个。
区间加时,对散块直接加,整块打标记。区间查时,散块直接统计,然后枚举 \(T_1\) 的每个块,加上这个块的标记。
时间复杂度 \(O(n+q\log{n}\sqrt{n})\),空间复杂度 \(O(n)\),块长取 \(400\) 跑得飞快。
洛谷P7986 [USACO21DEC] HILO P
\(dp_{i,j,b}\) 表示可以选 \(i\) 个小于等于 \(x\) 的数,可以选 \(j\) 个大于 \(x\) 的数,这一次的状态为 \(b\)HILO 期望次数。\(b=0\) 表示 HI\(b=1\) 表示 LO
考虑转移。按照 \(b\) 分讨,有:

\[dp_{i,j,0}\gets \frac{\sum_{k<i}dp_{k,j,1}+\sum_{k<j}dp_{i,k,0}}{i+j}+\frac{i}{i+j} \]

\[dp_{i,j,1}\gets \frac{\sum_{k<i}dp_{k,j,1}+\sum_{k<j}dp_{i,k,0}}{i+j} \]

前缀和优化后可以做到 \(O(n^2)\)。答案是 \(dp_{x,n-x,1}\times \prod_{i=1}^{n}i\)
arc069d Flags
显然有单调性,所以考虑二分。
可以发现每个点只有两个状态,可以用 2-SAT 来 check。
\(x\)\(y\) 分别排序后,可以二分出距离小于等于 \(d\) 的区间,需要支持点对区间连边和区间对点连边,可以用分块优化建图。
分块优化建图就是对每个块开一个点,连向块内的点。
CF538G Berserk Robot
把平面旋转 45 度,就能让四个方向变成 \((1,1),(1,-1),(-1,1),(-1,-1)\),新点为 \((x_i+y_i,x_i-y_i)\)。可以发现,两维被分割出来了。
考虑一维的问题。假设位置每秒加 \(1\),移动就变成了加 \(0\) 或加 \(1\),限制变为 \(p_i=\frac{x_i+t_i}{2},(t_i,p_i)\)
再转化一下限制,变为 \((a_i,b_i,X_i)\),其中 \(a_i<l,a_i+b_i\times l=t_i,X_i=p_i-b_i\times L\)\(L\) 表示走完一个周期后的位移。
\(a_i\) 排序后,\(X_i\) 一定是单调不减的,否则无解。通过相邻两个限制,可以得到若干个对 \(L\) 的限制,最后看能不能把 \(L\) 构造出来。
\(L\) 的限制:
考虑两个相邻限制 \((a_1,b_1,X_1),(a_2,b_2,X_2)\),设 \(b=b_2-b_1,X=X_2-X_1=p_2-p_1-b\times L\)
可以发现 \(0\le X\le a_2-a_1\),否则无解。进一步的,有 \(a_1-a_2+p_2-p_1\le b\times L\le p_2-p_1\)
\(b=0\)\(a_1-a_2+p_2-p_1\le0\le p_2-p_1\),否则无解。
\(b>0\)\(\lceil\frac{a_1-a_2+p_2-p_1}{b}\rceil\le L\le \lfloor\frac{p_2-p_1}{b}\rfloor\)
\(b<0\)\(\lfloor\frac{p_2-p_1}{-b}\rfloor\le L\le \lceil\frac{a_1-a_2+p_2-p_1}{-b}\rceil\)
arc103f Distance Sums
考虑相邻节点的 \(D\) 的变化。
若有边 \((u,v)\),则 \(D_v=D_u-2\times siz_u+n\)
可以发现,\(D\) 最大的一定是叶子,\(D\) 最小的一定是重心。
\(D\) 按大到小排序,然后从叶子结点往上连边,找不到对应的 \(D\) 就无解。最后从重心跑一遍看对不对。
锣鼓P7320 「PMOI-4」可怜的团主
很厉害的题。
把图的 dfs 树建出来,如果这棵树有 \(\ge\lfloor\frac{n}{3}\rfloor\) 个叶子结点,那么这些叶子结点就是独立集。
否则,设有 \(m\) 个叶子,把 \(i\)\(i+\lfloor\frac{m}{2}\rfloor\) 两两匹配,路径不够就加一些自环。
arc131e Christmas Wreath
边数一定是 \(3\) 的倍数,因此 \(n\equiv0,1\pmod 3\)。手模一下得到 \(n\le 5\) 时无解。
对于第一个条件,可以让 \(x\)\(1\sim x-1\) 之间的边为同一种颜色。
对于第二个条件,可以在第一个条件的基础上做,也就是把 \(1\sim n-1\) 划分成三个子集,子集的和相同。
可以手玩得到 \(n=6,7,9,10\) 的划分,然后从 \(x-6\) 递推到 \(x\)
可以发现分成 \(\{x-5,x\},\{x-3,x-2\},\{x-1,x-4\}\)
CF1270E Divide Points
把点按照 \(x,y\) 的奇偶性分成四个集合 \(S_{0,0},S_{1,1},S_{0,1},S_{1,0}\)
有一个好的性质是 \(x^2+y^2\equiv0,1,2\pmod4\),考虑通过欧几里得距离的平方模 \(4\) 的余数来分类。
下面的距离都是模 \(4\) 下的。
\(S_{0,0}\cup S_{1,1},S_{0,1}\cup S_{1,0}\ne\varnothing\),有 \(A=S_{0,0}\cup S_{1,1},B=S_{0,1}\cup S_{1,0}\),因为 \(A\) 的点两两距离为 \(0\)\(B\) 的点两两距离为 \(2\)\(A,B\) 间两两距离为 \(1\)
\(S_{0,0},S_{1,1}\ne\varnothing\),有 \(A=S_{0,0},B=S_{1,1}\),因为 \(A\) 的点两两距离为 \(0\)\(B\) 的点两两距离为 \(0\)\(A,B\) 间两两距离为 \(2\)
\(S_{0,1},S_{1,0}\ne\varnothing\),有 \(A=S_{0,1},B=S_{1,0}\),因为 \(A\) 的点两两距离为 \(0\)\(B\) 的点两两距离为 \(0\)\(A,B\) 间两两距离为 \(2\)
否则,可以把所有点的 \(x\)\(y\) 除二,继续跑。
agc012c Tautonym Puzzle
厉害题。
先把 \(1\sim100\) 递增放进去。若现在递增地放进去前 \(t\) 个偶数,则可以产生 \(2^t-1\) 的贡献。
可以在 \(2^t-1\le n\) 的前提下放进去前 \(t\) 个偶数。如果现在放进去 \(2\times x+1\),就能产生 \(2^x\) 的贡献,直接拆位就行。
锣鼓P6109 [Ynoi2009] rprmq1
狗都不写
把修改的第一维差分一下,然后看查询怎么做。对第二维维护一个支持区间加、区间历史最大值的线段树,把第一维扫一遍,\([1,l_1)\) 的修改不记录历史最大,\([l_1,r_1]\) 的修改记录历史最大,最后查 \([l_2,r_2]\) 的历史最大,可以用一个 tag 实现不记录历史最大。注意第一维一个位置的修改要先删再加。
猫树分治,每次把 \([l,mid]\) 的修改加进去,处理完这个节点的询问的右边,然后递归右子树。递归完后撤销 \((mid,r)\) 的修改,处理询问的左边,递归左子树。
太恐怖了qwq
锣鼓P6453 [COCI 2008/2009 #4] PERIODNI
在一个 \(n\times m\) 的网格上放 \(k\) 个的方案数是 \(\binom{n}{k}\times\binom{m}{k}\times k!\)
\([1,n]\) 开始递归,每次找到区间内的最小值的位置 \(p\),然后递归 \([l,p),(p,r]\),就能建出一棵树。
在这棵树上 dp。\(H_u,W_u\) 分别表示 \(u\) 矩形的高和宽,\(f_{u,i}\) 表示 \(u\) 子树放 \(i\) 个的方案,\(g_{u,i}\) 表示 \(u\) 子树放 \(i\) 个且不放在 \(u\) 矩形的方案。
\(g_{u,i}\) 的转移是显然的:$$g_{u,i}=\sum\limits_{j=0}^{i}f_{ls,j}\times f_{rs,i-j}$$
对于 \(f_{u,i}\),需要把儿子里选上的列去掉,得到$$f_{u,i}=\sum\limits_{j=0}^{i}\binom{H_u}{i-j}\times\binom{W_u-j}{i-j}\times(i-j)!\times g_{u,j}$$
洛谷P5113 Sabbat of the witch
分块。
对每个点和块开一个栈,存赋值操作的值和时间戳,用 \((t_i,v_i)\) 表示,每个块再维护一个块内和。
对于撤销操作,考虑对赋值操作打个标记,把散块和整块栈顶上有标记的退掉,散块重构,整块在块内按 \(t_i\) 排序,做个后缀和然后二分。
赋值操作是简单的。
\((T,V)\) 表示一个点所在的块栈顶的赋值操作,则这个点的真实值为 \(\left\{\begin{matrix}v_i&t_i>T,\\V&T>t_i.\end{matrix}\right.\)
查询操作是简单的。
qwq
CF932F Escape Through Leaf
有一个显然的 dp 式子:\(dp_u=\min\{dp_v+a_u\times b_v\}\)
可以发现 \(\min\) 里面的东西是一个斜率为 \(b_v\),截距为 \(dp_v\) 的若干直线,问 \(x=a_u\) 的最小值。
考虑 dsu on tree+李超树,是两个 \(\log\)
不会李超树合并 /ll。
锣鼓P10919 运输规划
\(h\) 建小根笛卡尔树后,\(i\) 能到的点就是 \(i\) 子树里的点。
先考虑在什么情况下有解。根据 Hall 定理,当且仅当所有子树里机场的数量大于等于卡车的数量,用 \(a_i\) 表示这个东西。
从小到大枚举机场,能匹配它的一定是根到这个点上的没匹配的车。考虑找出编号最小的,到机场的路径上 \(a\) 的最小值大于等于 \(1\) 的卡车 \(u\),匹配上,然后把 \(u\) 到这个机场的路径上的 \(a\)\(1\)(不包括那个车)。
洛谷P3763 [TJOI2017] DNA
枚举匹配的起点,然后直接二分哈希,给三次匹配不上的机会,然后做完了。
qwq。
洛谷P5298 [PKUWC2018] Minimax
线段树合并优化 dp 典(?)题。
先把权值离散化。设 \(f_{u,i}\) 表示 \(u\) 的权值为 \(i\) 的概率。
\(ls\) 表示左子结点,\(rs\) 表示右子节点,有一个比较显然的转移:$$f_{u,i}=f_{ls,i}\times(p_u\times\sum\limits_{j<i}f_{rs,j}+(1-p_u)\times\sum\limits_{j>i}f_{rs,j})+f_{rs,i}\times(p_u\times\sum\limits_{j<i}f_{ls,j}+(1-p_u)\times\sum\limits_{j>i}f_{ls,j})$$
合并的时候,如果左右子节点的树有一个是空的,就打个乘法标记,否则继续往下递归。
锣鼓P13114 [GCJ 2019 #1C] Bacterial Tactics
每次把一个矩形用一次合法操作分成两个小矩形,递归下去算 sg 就做完了。
统计方案是简单的。
agc037d Sorting a Grid
\(x\) 的颜色为 \(x\)\(D\) 的位置的行数。
考虑 \(B\)\(C\) 有什么要求。可以发现 \(C\) 中所有的颜色都要在对应的行,\(B\) 中所有的列的颜色不重。
可以发现,有了 \(B\) 后构造 \(C\) 是容易的,只要把每列做个冒泡就行,所以只考虑 \(B\) 的构造。
一列一列做。每行建一个点,每个颜色建一个点,可以发现这是一个二分图匹配,直接做就行。
agc016e Poor Turkeys
考虑对每个鸡,处理出它能不能活到最后,\(f_{i,j}\) 表示它活到最后 \(j\) 鸡要不要死。
时间逆序考虑。对于一对 \((x,y)\),若 \(f_{i,x}=f_{i,y}=1\),那么 \(i\) 一定要拿 \(x,y\) 挡刀,但 \(x,y\) 只能活一个,所以 \(i\) 一定活不了。若 \(f_{i,x}=1\),则把 \(f_{i,y}=1\) 设为 \(1\),因为 \(i\) 之后要拿 \(x\) 挡刀,所以这次只能 \(y\) 死。\(f_{i,y}=1\) 时同理。若两个都是 \(0\) 就什么都不做,因为 \(x,y\) 的死活和 \(i\) 无关。
处理答案时直接枚举。对于 \(i,j\),若 \(\exists x,f_{i,x}=f_{j,x}=1\),则 \(i,j\) 不能一起活下去。因为若 \(i\)\(x\) 挡刀,则 \(j\) 就会死。同理,\(j\)\(x\) 挡刀,\(i\) 就会死。
锣鼓P13356 [GDCPC 2024] 图
看到 \(n-1\),可以考虑构造出 \(k\) 个生成树(第 \(k\) 个图可能不是)。
先考虑朴素做法。对于一条边 \((u,v)\),遍历 \(k\) 张图,找到第一张 \(u,v\) 不连通的图,把这条边加上去,如果全都连通就不管。连通性用并查集维护。
可以发现,若第 \(i\) 张图中 \(u,v\) 连通,则第 \(1\sim i - 1\) 张图中 \(u,v\) 也连通,所以可以二分。
输出方案是简单的,从第 \(k\) 张图中找到两个连通的点 \(u,v\) 就是答案。输出路径只要在树上跳就行。
锣鼓P10360 [PA 2024] Desant 3
厉害。
看到数据范围以及对 Desant 系列的了解,这题的时间复杂度绝对不会很正常。
\(f_x=-1,0,1\),表示 \(x\) 的状态为未知/没准备/准备,初始是全都未知。
考虑依次对每个操作处理。设当前操作为 \((a,b)\)
\(f_a,f_b\ne-1\),直接模拟,然后下一个操作。
\(f_a=f_b=-1\),可以发现,只有 \(f_a=f_b\) 时对答案有贡献。因为当 \(f_a=1,f_b=0\) 时其实是和 \(f_a=0,f_b=1\) 是同一种情况,而答案要模 \(2\),就会被抵消掉。
\(f_a=0\)\(f_b=1\),则无论另一个取什么值这个操作都无效,直接递归下一个。
\(f_a=1,f_b=-1\),可以发现下一个状态是 \(f_a=-1,f_b=1\)
\(f_a=-1,f_b=0\),可以发现下一个状态是 \(f_a=0,f_b=-1\)
统计答案的时候,直接枚举答案区间。可以发现有些位置到最后也没有确认,所以让在区间内的为 \(1\),区间外的为 \(0\) 就行。
考虑时间复杂度,因为当 \(f_a=f_b=-1\) 时,对 \(f\)\(2\) 个位置都有影响,其它的情况都是直接递归下去,因此是搜索的时间复杂度是 \(O(2^{\frac{n}{2}})\),总时间复杂度为 \(O(2^{\frac{n}{2}}(m+n^2))\)
锣鼓P5445 [APIO2019] 路灯
先把所有询问的 \(b\) 减一(因为我看不惯),就相当于查询区间 \([a,b]\) 有多少个时刻为全 \(1\)
考虑对所有询问记录下他的答案 \(f_{l,r},l\le r\)
考虑点亮操作。记 \(x\) 为点亮的位置,\(l\) 为点亮后能到达的最左位置,\(r\) 为点亮后能到达的最右位置,\(t\) 为当前时间。这个操作相当于对 \(f\)\(l\le i\le x,x\le j\le r\)\(f_{i,j}\) 加上 \(q-t\)
熄灭操作是类似的,对 \(f\)\(l\le i\le x,x\le j\le r\)\(f_{i,j}\) 减去上 \(q-t\)
查询操作就是单点查。如果这个区间现在是连通的,还要减去 \(q-t\)
可以发现,这个题转化成了矩形加单点查,可以差分成单点加前缀矩形查,用 充电器 分治来维护。
\(l,r\) 可以用一个 set 来维护。
洛谷P5840 [COCI 2015] Divljak
很好的题。
\(S\) 建 AC 自动机。
对于一个 \(T\),在 trie 树上跑(要跳 fail),经过的点连成的字符串为它的所有前缀。
考虑一个自动机的点在 fail 树(就是所有 fail 边连成的树)上的所有祖先是什么。可以发现,这些祖先为它代表的串出现过的所有后缀。
因此,对于一个 \(T\) 跑 trie 树时经过的点,它在 fail 树上到根的路径上所有点代表的字符串都是 \(T\) 出现过的子串,这些路径的并集为 \(T\) 出现过的所有子串的点。
把经过的点记录下来,记为点集 \(P\),要把它们到根的路径的并集的所有点的答案加 \(1\)。把 \(P\) 里的所有点到根的路径加 \(1\),然后把 \(dfn\) 相邻的两个点的 lca 到根的路径减 \(1\)
可以差分后变成单点加子树查,拿一个树状数组维护。

posted @ 2025-07-03 23:32  天域_awa  阅读(116)  评论(0)    收藏  举报