8.7杂题

P4116 Qtree3

给出 \(N\) 个点的一棵树(\(N-1\) 条边),节点有白有黑,初始全为白。

0 i:改变某点的颜色(原来是黑的变白,原来是白的变黑)。

1 v:询问 \(1\)\(v\) 的路径上的第一个黑点,若无,输出 \(-1\)

直接树链剖分+ set 维护最小黑点,就ok了。

P4114 Qtree1

给定一棵 \(n\) 个节点的树,有两种操作:

  • CHANGE i t 把第 \(i\) 条边的边权变成 \(t\)
  • QUERY a b 输出从 \(a\)\(b\) 的路径上最大的边权。当 \(a=b\) 时,输出 \(0\)

树链剖分+线段树维护最大值,边权转点权,跳链时避开lca就可以了

P13595 『GTOI - 1B』筝

给一个序列,你可以改值,把所有 \(x\to y\) 价值为 \(|x-y|\)\(a_i=a_j\)\(i\to j\) 都完成,问整个序列完成的最小代价。

结论就是变的时候只\(+1~or -1\) 。因为这样一定不劣,可能会把更多的数字包括进来,然后就是线段覆盖了。

P2182 翻硬币

小 D 一次一定会同时翻转 \(M\) 枚硬币。由于小 D 是一个爱动脑的小学生,这样进行了若干次之后她很快想到了一个问题:有多少种方法能够在 \(K\) 次翻转后把硬币由原来的状态变成现在这样呢?

方案数对 \(10^9+7\) 取模。

我们先发现不能状态压缩,因为 \(n=100\),然后我们想到把所有硬币分成两类:需要反转的,不需要反转的,每次乘上一个组合数就好了 \(O(n^3)\)

P1725 琪露诺

给定一长度为 \(N + 1\) 的数列 \(A\) , 第 \(1\) 项为 \(0\) 以第一项为起点 , 对于当前的位置 \(i\) 可以转移到: \((i + L, i + R)\) 中任意一位置并且获得当前位置上 数的价值。求 : 当位置 \(\ge N + 1\) 时可以取得的 最大价值和 。

水题:有一个显然的 \(n^2\) 做法,然后我们发现是区间 max 用单调队列优化就做完了。

P13564 「CZOI-R5」奶龙

现有一张 \(n\) 个点,初始没有任何边的编号 \(1\sim n\) 的图,给定长度为 \(m\) 的数组 \(A_i\),表示编号为 \(A_i\) 的点上有一只奶龙,在每一次行动中,奶龙会沿着当前点连向其它点的边走向下一个点。

请你构造一张图,给定正整数 \(k\),使得其满足:

  • 每个点的出度均为 \(1\),不得有自环。
  • 经过恰好 \(k\) 次行动时,所有点都被至少一只奶龙经过,且在经过恰好 \(k-1\) 次行动时,至少有一个点未被任何奶龙经过。

若无解则输出 -1

先判断上下界,好像是 $ m \times (k+1) <n $ 且 $ n-m < k $。

我们把每个奶龙和 \(k\) 个没有奶龙的点连成链。最后再连到第一条奶龙即可。

P5943 [POI 2002] 最大的园地

在一个 \(n\times n\) 的正方形内找到最大的由 0 组成的矩形,输出它的面积。

暴力+前缀和预处理+最优性剪枝就可以了。

P3313 [SDOI2014] 旅行

给一颗树,上面有一些城市,城市相信一些教派,旅行者只会在相同教派城市留宿。

  • CC x c:城市 \(x\) 的居民全体改信了 \(c\) 教;
  • CW x w:城市 \(x\) 的评级调整为 \(w\)
  • QS x y:一位旅行者从城市 \(x\) 出发,到城市 \(y\),并记下了途中留宿过的城市的评级总和;
  • QM x y:一位旅行者从城市 \(x\) 出发,到城市 \(y\),并记下了途中留宿过的城市的评级最大值。

这是正常树剖多了一个颜色维度,但是我们发现信息总量不变,所以我们动态开点维护就好了。

弱化版:P5838 [USACO19DEC] Milk Visits G SP11985 GOT - Gao on a tree

U478138 叁仟柒佰万 clods

给定一个序列 \(a\),你需要把它划分成任意多段,满足任意一段的 mex 值相同,求方案数,对 \(10^9+7\) 取模。
定义一个区间的 mex 为区间中最小的没有出现过的自然数。

先发现一个性质,所有子区间的 mex 等于 原序列的 mex。然后我们开始看那些区间是可能的,想到我们先固定一个区间,把右端点向更右延伸来算贡献,所以我们用 dp。我们先处理每个左端点的第一个合法右端点,起右边的所有答案都能使用,所以我们直接前缀和优化一下就做完了。

P6155 修改

给定一个长度为 \(n\) 的整数序列 \(a_i\),再给定一个长度为 \(n\) 的整数序列 \(b_i\)

你可以进行一些修改,每次你可以将一个 \(a_i\) 增加 \(1\),花费为 \(b_i\),你需要使所有的 \(a_i\) 不相等,且同时满足花费最少。

但 zbw 认为太过简单,于是他规定,你可以在修改前进行无限次如下操作:交换 \(b_i,b_j(1 \leq i,j \leq n)\)

求最小的花费。

由于答案可能很大,请输出答案对 \(2^{64}\) 取模后的值。

我们先玩一下数据,发现几个性质:

  • 交换尽量少的点。
  • 排序后遇到空位能放就放。
  • 修改区间无交叉时最优。

发现这个东西满足栈的性质,直接维护即可。

P2121 拆地毯

会场上有 \(n\) 个关键区域,不同的关键区域由 \(m\) 条无向地毯彼此连接。每条地毯可由三个整数 \(u\)\(v\)\(w\) 表示,其中 \(u\)\(v\) 为地毯连接的两个关键区域编号,\(w\) 为这条地毯的美丽度。

由于颁奖典礼已经结束,铺过的地毯不得不拆除。为了贯彻勤俭节约的原则,组织者被要求只能保留至多 \(K\) 条地毯,且保留的地毯构成的图中,任意可互相到达的两点间只能有一种方式互相到达。请你帮忙算出这至多 \(K\) 条地毯的美丽度之和最大为多少。

一眼最大生成树,没了。

P6492 [COCI 2010/2011 #6] STEP

给定一个长度为 \(n\) 的字符序列 \(a\),初始时序列中全部都是字符 L

\(q\) 次修改,每次给定一个 \(x\),若 \(a_x\)L,则将 \(a_x\) 修改成 R,否则将 \(a_x\) 修改成 L

对于一个只含字符 LR 的字符串 \(s\),若其中不存在连续的 LR,则称 \(s\) 满足要求。

每次修改后,请输出当前序列 \(a\) 中最长的满足要求的连续子串的长度。

经典序列维护 维护左右端点颜色,区间长度,整个区间有无连续段,最长左侧起满足段,最长右侧起满足段即可。

P3201 [HNOI2009] 梦幻布丁

\(n\) 个布丁摆成一行,进行 \(m\) 次操作。每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色。

有一种做法是启发式合并,但是我不是很会,所以我用动态开点线段树来做的。我们发现信息总量和颜色无关,所以我们直接动态开点之后就没啥了,会合并的操作就做完了。

P4310 绝世好题

给定一个长度为 \(n\) 的数列 \(a_i\),求 \(a_i\) 的子序列 \(b_i\) 的最长长度 \(k\),满足 $b_i $ \(\&\) $ b_{i-1} \ne 0 $,其中 \(2\leq i\leq k\)\(\&\) 表示位运算取与。

妙妙 dp。我们先平凡拆位,总量是 \(n\log n\) 的直接开就行了,dp怎么转移呢,这一位先把所有可能增加的长度取max 然后再把max 赋给自己所有二进制位为 $ 1$ 的情况即可转移。

P12200 Hash Killer Extra P12198 Hash Killer II

本题为给定 base 和 mod 的情况下卡单哈希。

卡单模哈希。

根据生日悖论我们只需要随机 \(\sqrt n\) 个点就可以直接卡掉了。

P3574 [POI 2014] FAR-FarmCraft

一个有 \(n\) 个节点的树,遍历整棵树一遍,在每个节点打开开关自动进行一次 \(t_i\) 时间的操作,开开关不算时间,求最终用的最短时间。特别的,\(1\) 号点在最后关闭。

先设出 \(g_i,f_i\) 分别表示子树大小和子树完成时间。

有一个显然的贪心,对于一个子树我们直接把儿子按照 \(f_i-g_i\) 排序,按照这个顺序便利即可,那么怎么更新父亲节点呢?\(g_i\) 是简单的,我们看 \(f_i\) 是怎么更新的,有如下式子 \(f(root)=max{∑(g_j+2)+f_i+1}\) ,其中 \(j\)\(root\) 中儿子 \(i\) 的上一个儿子。最后 \(ans=\max (f_1, g_1 + t_1)\)

P6327 区间加区间 sin 和

给出一个长度为 \(n\) 的整数序列 \(a_1,a_2,\ldots,a_n\),进行 \(m\) 次操作,操作分为两类。

操作 \(1\):给出 \(l,r,v\),将 \(a_l,a_{l+1},\ldots,a_r\) 分别加上 \(v\)

操作 \(2\):给出 \(l,r\),询问 \(\sum\limits_{i=l}^{r}\sin(a_i)\)

根据和角公式转成区间加,区间改即可。

P2501 [HAOI2006] 数字序列

现在我们有一个长度为 \(n\) 的整数序列 \(a\)。但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列。但是不希望改变过多的数,也不希望改变的幅度太大。

先转化成不下降 \(a_i=a_i-i\)

第一问的答案是最长不下降子序列(注意最长不下降子序列不止一种)。

第二比较难,我们仙游一个结论,对于确定的序列中的最小的固定两点之间。我们枚举一个点,其前面为左侧值,右侧为右侧固定值。这样子操作一定会有最优值。我们记下来转移即可。证明看第一篇题解。

P7296 Uddered but not Herd G

给定字符串\(S\)。对于任意一个字母排列\(P\),有将\(S\)划分成若干段后每一段都是\(P\)的子序列的最少段数。问所有排列最少段数的最小值。

数据范围:\(1\le|S|\le10^5,|\Sigma|\le20\)

我们看最本质影响答案的操作是什么,是每种字母表的顺序是吧,然后我们来确定答案 即为 \(w_i\ge w_{i+1}\) 数目,我们把这个东西与处理出来,即预处理每个字符的后一个字符的对应数目。然后我们状态压缩枚举每一种可能 \(O(2^{20}\times 20^2)\)

posted @ 2025-08-07 10:09  NeeDna  阅读(16)  评论(0)    收藏  举报