20250714 贪心/构造/杂题
种树
A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树。
园林部门得到指令后,初步规划出 nn 个种树的位置,顺时针编号 11 到 nn。并且每个位置都有一个美观度 AiAi,如果在这里种树就可以得到这 AiAi 的美观度。但由于 AA 城市土壤肥力欠佳,两棵树决不能种在相邻的位置(ii 号位置和 i+1i+1 号位置叫相邻位置。值得注意的是 11 号和 nn 号也算相邻位置)。
最终市政府给园林部门提供了 mm 棵树苗并要求全部种上,请你帮忙设计种树方案使得美观度总和最大。如果无法将 mm 棵树苗全部种上,给出无解信息。
反悔贪心点题,用链表维护,选择x后插入l[x] + r[x] - x,注意是链表不是原始表
B - Coins
Problem Statement
There are X+Y+ZX+Y+Z people, conveniently numbered 11 through X+Y+ZX+Y+Z. Person ii has AiAi gold coins, BiBi silver coins and CiCi bronze coins.
Snuke is thinking of getting gold coins from XX of those people, silver coins from YY of the people and bronze coins from ZZ of the people. It is not possible to get two or more different colors of coins from a single person. On the other hand, a person will give all of his/her coins of the color specified by Snuke.
Snuke would like to maximize the total number of coins of all colors he gets. Find the maximum possible number of coins.
你可以去用六个堆做,我不管你
考虑初始都选A,那么就变成了选X个B和Y个C,反悔贪心即可。
Work Scheduling G
然后如果一个工作有时间去做,就先做了它(听起来有点怪),然后把它的价值压入一个小根堆。当我们找到一个没法做却价值比当前堆顶高的工作时,我们就放弃那个最小的工作,用做它的时间去做这个价值更高的工作。
建筑抢修
和上一题类似,但是这题贡献都一样,那么就选耗时最长的。
- Errich-Tac-Toe (Hard Version)
X+YMOD3的点有三种,删除随便一种一定满足情况,抽屉原理一定有一种满足约束
Mine Sweeper II
同样抽屉原理
发现反图和原图数字和一样
反图和原图一定有一个符合条件
Ehab's Last Corollary
保证有解
随便一个环,小于k就直接输出,否则一定能选出来最大独立集满足约束。
Baggage
看题解
发现可以递归构造
做到了在四步的操作下将 n→n−4。
由于 n=1,2 无法操作且 n=3 无法再仅空两格的情况下复原。
所以我们只在 n≥8 的情况下递归求解。
至于 n<8 的情况可以直接暴搜求解。
CF1470D Strange Housing
首先,我们随便拿出来一个生成树,然后按 dfs 序染色,如果周围没有已经选择的点就选择当前点。
为什么这样是对的呢?
在过程中,我们其实保证了图的连通,其实是在 dfs 中保证了任意的已访问的 i 与父亲连通,初始没有点,满足要求,在 dfs 的过程中:
若选择了 i 或 fai,则一定连通,否则若都不能选,则说明都与之前的点连通,所以这两个点依然连通。
接下来是波罗的海部分
P10763 [BalticOI 2024] Tiles
有一个存在 N 个顶点的大教堂,顶点坐标依次为 (xi,yi),对于每个 1≤i<N,存在一条 i 与 i+1 之间的边,此外,还存在一条 N 到 1 的边。
大教堂每条边都与 x 轴或 y 轴平行。此外,大教堂是一个简单多边形,即:
每个顶点恰好由两条边相交
任何一对边只能在顶点处相交
你有无数块 2×2 的瓷砖,你希望用这些瓷砖覆盖大教堂的大部分区域,具体来说,你想选择一条垂直线,并覆盖该线左侧的大教堂部分。对于任何整数 k,设 Lk 为包含 x 坐标等于 k 的点的垂直线。对 Lk 左侧大教堂部分的覆盖,是指在平面上放置一定数量的瓷砖,使得:
多边形内部且 x 坐标小于 k 的每个点都被某块瓷砖覆盖
多边形外部或 x 坐标大于 k 的点都不被任何瓷砖覆盖
瓷砖的内部不重叠
大教堂中任何顶点的最小 x 坐标为 0。我们设 M 为大教堂中任何顶点的最大 x 坐标。
请你求出最大的满足条件的 k (0≤k≤M),根据定义,一定存在答案为 0。
扫描线,但是非常难维护
维护两个set
分别表示竖直线段为奇数,和偶数的所有线段。
事件点: 扫描线的事件点是多边形的所有竖直边的 x 坐标。我们将所有不同的 x 坐标收集起来并排序,作为扫描线停留的位置。
扫描过程: 扫描线从左到右依次扫过每个事件点 x i 。在两个事件点 x i 和 x i + 1 之间的开区间 ( x i , x i + 1 ) 内,多边形的竖直剖面是固定的。这个剖面由一系列不相交的竖直线段组成。 我们需要检查这个剖面中的每条线段 (y_start, y_end) 的长度 y_end - y_start 是否都是偶数。
维护剖面: 我们需要一个数据结构来动态地维护当前扫描线位置的竖直剖面。当扫描线遇到一个竖直边时,剖面会发生变化(增加或减少一条线段)。
奇偶性: 问题的核心在于线段长度的奇偶性,以及线段端点坐标的奇偶性。我们可以将所有 y 坐标按奇偶性分开处理。
数据结构: std::set<pair<int, int>> 是一个合适的数据结构。我们可以用两个 set,st[0] 和 st[1],分别维护端点 y 坐标都是偶数和都是奇数的线段。
合并与分裂: 当加入一条新的竖直线段时,我们检查它是否能与 set 中已有的线段在端点处相连。如果能,就将它们合并成一条更长的线段。删除线段时,则进行相反的分裂操作。
合法性判断
令 cnt 为当前剖面中所有长度为奇数的线段的总数。 一个剖面是合法的,当且仅当 cnt == 0。
在扫描线从 x i 移动到 x i + 1 的过程中,我们需要判断区间 [ x i , x i + 1 ) 是否可铺砖。 设 x_i_parity = b[i] & 1。 可铺砖的条件是:
在 x i 位置,所有竖直线段长度为偶数。
在 ( x i , x i + 1 ) 区间内,所有水平线段的 y 坐标为偶数。这等价于,在 x i 处新增或删除的线段,其端点 y 坐标的奇偶性必须与 x i 的奇偶性相同。
例如,如果 x i 是奇数,那么在 x = x i 处的水平边,其 y 坐标也必须是奇数,才能保证 2 × 2 网格不被破坏。但题目条件更强,要求所有水平边y坐标为偶数。
让我们重新审视铺砖条件。一个 2 × 2 的砖块,其四个角的坐标奇偶性各不相同。例如,左下角为 ( 2 a , 2 b ) 的砖块覆盖区域 [ 2 a , 2 a + 2 ] × [ 2 b , 2 b + 2 ] 。
这意味着,任何构成区域边界的线段,其坐标必须是偶数。即所有竖直边的 x 坐标和水平边的 y 坐标都必须是偶数。
insert 和erase
有一堆特判
P12429 [BalticOI 2025] Developer
你负责在托伦郊区开发新的房产。你已经决定将建造一条主干道和沿街的 n 处房产,编号从 1 到 n。该地区地势略有起伏,第 i 处房产的海拔高度为 ai 厘米。
事实证明,没有人愿意购买位于斜坡上的房产。形式化地说,对于海拔高度序列 a1,a2,…,an,一个斜坡是指满足以下条件的连续子序列 ai−1,ai,…,aj,aj+1(其中 2≤i≤j≤n−1):
ai−1<ai=ai+1=…=aj<aj+1,或者
ai−1>ai=ai+1=…=aj>aj+1。
直观地说,一个斜坡是指位置 i−1,i,i+1,…,j,j+1 上的连续房产区域,其中位置 i,i+1,…,j 的所有房产海拔高度都等于某个值 h,且 h 严格位于 ai−1 和 aj+1 之间。
你可以任意增加或减少任何房产的海拔高度(以整数为单位调整),但当然你希望尽量减少总工作量。你的任务是确定消除所有斜坡所需的最小总海拔变化量。也就是说,你需要找到一组不存在斜坡的海拔高度 b1,b2,…,bn,使得 ∣a1−b1∣+∣a2−b2∣+…+∣an−bn∣ 尽可能小。调整后的海拔高度 bi 必须是整数(特别地,它们不一定要是正数),且对 bi 没有其他约束。
这是个神秘结论题,题解有证明,但是。
dpi,j,0/1 表示前 i 个处理完,bi=j,当前的 bi 相等段为下/上时的最小代价。
容易转移:dpi,j,0=min(k>jmin{dpi−1,k,1},dpi−1,j,0)+∣ai−j∣,dpi,j,1=min(k<jmin{dpi−1,k,0},dpi−1,j,1)+∣ai−j∣。
有聪明的选手猜了一下 j 只可能取某个 ax,没拿到什么分。
有更聪明的选手猜了一下 j 只可能取某个 ax−1,ax,ax+1,获得了 O(n2) 的分。
有非常聪明的选手猜了一下 j 只可能取某个 [i−O(1),i+O(1)] 内的 x 的 ax−1,ax,ax+1,获得了满分。