JOI 传统题选做

  • P5101:典型的需要倒着考虑的题目,然后手玩感受一下就可以得到充要条件,即除了两端的连续段长度均为偶数。统计答案的话用一点 DS 维护一下即可。

  • P5102:暴力统计的方式是枚举左下角的点看另外三个点存不存在。考虑到每一天只是对第一天的所有点同时加一个 \((dx,dy)\) 向量,我们可以对每个点维护出现时间的区间,统计时只需要把相邻四个点的出现时间区间求交即可。但是这样有可能会算重,我们需要把所有本质相同的点压缩成一个再统计。细节较多。

  • P6118:注意到所有的 \(y\) 一定在 \(x\) 为根的严格最长链上,换句话说 \(y\) 一定在 \(x\) 到某个直径端点的路径上。那么以直径端点为根 dfs,在 dfs 的过程中动态维护全局贡献,用栈和桶精细实现可以做到线性。

  • P7212:显然如果有二元环,经过一次交友活动后,这个连通块会变成一个团。然后两个团之间如果形成了二元环会合并两个团,合并过程可以用启发式合并维护。细节较多。

  • P7214:模仿 WC2026 T2 的方式,将治疗计划放到二维平面上,那么可以得到若干条线段。我们需要找到一条从 \(1\) 到 \(n\) 的封锁线,考虑 \(j\) 能接在 \(i\) 后面当且仅当 \(r_i-l_j+1\ge |t_i-t_j|\),此时连边 \(i\to j\)。此时优化建图类似于一个二维数点,但是由于是点权最短路所以每个点最多更新一次,暴力线段树维护即可。时间复杂度 \(O(m \log^2 m)\)。

  • P7215:注意到对于某种颜色 \(c\),建出它的虚树,那么虚树上的所有颜色也必须全部选择。那么实际上问题类似于 2-SAT 问题,建图时用数据结构优化建图即可。

  • P7216:观察题目性质,通过调整法可以得到最靠左的右边界上必须选择一个点,剩下三个方向同理。如果 \(K\le 3\),根据抽屉原理可知必须选择一个交点,爆搜处理。对于 \(K=4\),此时还有一种情况是四个边界上各选一个点。考虑剩余矩形对选点位置的限制,如果与 \(1,3,4\) 条边界有交都是好处理的,而如果只与 \(2\) 条边界有交可以转化为 2-SAT 问题,最后前后缀优化建图即可。

  • P7217:思路不难,对每一个大苹果单独处理,那么相当于找到这个苹果前面第一个人,完了之后暴力跳 \(pre_i\),这些人可以吃到贡献。很显然所有 \(i\to pre_i\) 形成内向基环树,对环上点和树上点分开讨论,贡献全都是二维数点。细节较多。

  • P7219:模拟赛出过类似的题目。矩形限制让我们想到构建笛卡尔树,那么此时笛卡尔树上的每个节点对应一个极大的矩形。此时考虑一颗星星,包含它的极大矩形一定是笛卡尔树上的一条祖先后代链。问题转化为给定若干条祖先后代链,求权值最大的方案使得这些链不交。dp 一下,需要求一个链和,数据结构维护即可。

  • P7220:和 P8987 思路类似。注意到如果 \(x,y\) 有单调性那么容易数据结构维护。而如果不满足的话,注意当前所有被推动过的点会分布在一条轮廓线上,自然满足这个要求。所以只需要求出每个点第一次被推动的时间,显然是一个二维数点。对于动态加点的部分,分治时间维离线做即可,复杂度 \(O(n\log^2 n)\)。

  • P7407:容易发现一条边的策略只有两种:把自己改成新的颜色,或者把与当前点相邻的和自己同色的边全部改掉。二者取 \(\min\) 连边作为边权。不过有一个问题是如果原本存在 \(x\to y\to z\) 两条边颜色相同,如果第一步选择修改 \(x\to y\) 的颜色,那么统计 \(y\to z\) 的相邻同色边时不应该计算 \(x\to y\)。这种情况直接连边 \(x\to z\),建虚点优化边数即可。

  • P7408:首先有一个简单的贪心,然后来考虑 \(T=n+1\) 的情况,扫描线扫描 \(S\),利用单调栈维护 \(nxt_i\)。注意到单调栈的栈顶一定是 \(i+1\),我们考虑维护 \(i+1\to i\) 的变化。假设当前要弹出的栈顶为 \(x\),弹出后栈顶为 \(y\),那么存在一个长度为 \(\max(p_i+U,p_y)-p_x\) 的区间,可以把油价从 \(b_x\) 变为 \(b_i\),这是一个关于 \(U\) 的分段函数,线段树动态维护每个 \(U\) 的贡献即可。

    区间查询的话考虑找到不动点后差分,注意到 \([T-U,T]\) 中的最小值无论如何都会走到,并且走到它时油量一定为 \(0\),据此差分计算答案即可。

  • P7559:枚举 \(1\) 号点的方向再讨论。现在每个点的移动方向只有两种可能了,不过这还是不好做。再思考一下,把 \(1\) 号点挪到原点,那么对于一个点如果 \(|x|\ne |y|\) 的话,我们肯定往绝对值更大的地方走才有可能被感染;而 \(|x|=|y|\) 分析一下也可以得出类似结论,所以实际上每个点只有一种方向。得出这个以后连边跑一个类似最短路的状物,然后用线段树优化 dijkstra 的过程即可。

  • P7562:字典序直接考虑贪心,问题变为求解一个后缀最多能选出多少不交区间。好吧这实际上是做不了的,我们考虑另一个做法。我们考虑维护所有没有被选的连续段,如果一个区间被选后它所在的连续段会被分裂为两个。然后我们只需要考虑快速求解一个连续段的答案,而这不会被修改,直接倍增维护区间数即可,单次计算复杂度 \(O(\log n)\)。

  • P7565:观察注意到 \(j\) 为奇数答案为 \(1\),然后再考虑偶数的情况。观察注意到合法的 \(k\) 一定是一条链,并且链的两端 \(u,v\) 满足 \(u,v\) 子树内各有 \(\frac{j}2\) 个点。然后现在我们考虑所有的 \((u,v)\),实际上他们会给 \(j\le 2\min(siz_u,siz_v)\) 的 \(j\) 贡献 \(dis(u,v)\),那么这就是一个路径统计问题,点分治求解即可。

  • P7670:记三种字符个数为 \(c_0,c_1,c_?\),显然我们有一个单次查询 \(O(2^{c_?})\) 的做法,考虑到 \(c_0+c_1+c_?\le 20\),那么 \(\min(c_0,c_1,c_?)\le 6\),所以我们只需要搞出 \(O(2^{c_0})\) 的做法即可。这也是简单的,直接将所有 ? 当成 0,求出这个数的高维后缀和,那么原先为 0 的位置可能被算错,做一下容斥就是 \(O(2^{c_0})\)。\(O(2^{c_1})\) 同理,只需要提前预处理高维前后缀和即可。

  • P8164:考虑先判断一个子矩形是否合法,找到矩形中的最大值,每一次往相邻格子中最大的走,如果能走完说明合法。把每个格子走的过程连边,则我们要判断图是否是一条链。考虑对每个点赋权值为自己的权值减去出点的权值,同时对于入度为 \(0\) 的点将权值赋为 \(\infty\) 减去出点的权值,这样图是一条链当且仅当点权值和恰等于 \(\infty\)。

    回到原题,枚举上下边界后扫描线,根据上述条件计算合法矩阵,复杂度 \(O(n^2m)\),令 \(n\le m\) 得复杂度为 \(O(N\sqrt N)\)。

  • P8424:首先原始序列平均数 \(mid\) 一定包含在答案区间中,然后考虑操作 \(i\) 次后的所有区间,记平均数 \(<mid\) 的最大值为 \(a_i\),\(>mid\) 的最小值为 \(b_i\),那么答案的一个下界是,给出一个序列 \(c_i\),使 \(c_i=a_i\) 或 \(c_i=b_i\),最小化 \(c\) 的极差。可以证明答案能够取到这个下界,求解的时候扫描 \(c\) 的最小值维护最大值即可,复杂度 \(O(n\log n)\)。

  • P8426:部分分有两档非常具有提示性:\(m-n\le 13\) 和保证图是点双。注意到对于一个点双图,如果其中存在同胚于 \(K_4\) 的子图那么一定存在两条路径权值和不同,于是一定有解。那么判断这个条件容易想到利用广义串并联图方法缩图,可以得到无解的充要条件为:缩图后图只有 \(1,n\) 且 \(1,n\) 连边边权全部相同。

    考虑如果不是点双怎么办,我们直接在 \(1,n\) 中间加入一条长度为最短路的边,这样 \(1,n\) 一定在同一个点双内,剩下的点双我们走进去就出不来了,可以扔掉,然后就做完了。

posted @ 2026-11-02 11:41  UKE_Automation  阅读(3)  评论(0)    收藏  举报