组合优化,构造与计数

组合优化

这里主要讲决策单调性。

qoj # 9737. Let's Go! New Adventure

首先,直接决策单调性看似有道理,但实际上有缺陷。权值并不是蒙日矩阵。
考虑改一下权值,记 w(l,r)=pc+i[l,r]aii=1pbibp+1,相当于对当前状态的评估。
此时,区间的权值是关于 ai 的连续凸函数。矩阵也因此是蒙日矩阵。决策单调性 O(nlog2n)

CF2061I Kevin and Nivek

构造

P3524 [POI 2011] IMP-Party

逆天绿题构造不会。首先,我们建反图,先把团转化为独立集。这更便于我们思考。
已知有 23n 大小的独立集,求大小为 13n 的。考虑对于一条边,那么其两端点不会同时在独立集里。
考虑直接将这两个点删掉。每次最多删掉独立集中的一个点,删 13n 次剩下的点一定是一个独立集。

CF1365G Secure Password

这个题每个二进制位是独立的。
我们需要找如果某个二进制位只有 1 个,那么需要找到这个位置,包含这个位置的询问都为 1,其他为 0
下意识以为是二进制分组。相当于集合的二分,但是二分两端都要找,这需要 20 次。
考虑我们的询问与答案位置的关系。设我们要找的位置是 i,那么答案为 1 的询问的交必须为 {i}
也就是说其他的 j 至少在答案为 0 的询问里出现一次。我们需要对于任意 i,j 满足这个条件。
考虑每个元素被问的询问集合 vi。考虑让每个元素在 6 次询问中出现,这么看 C136>1000 是合法的。
这样的话任意 vi|vivj|1。所以任意一种询问的答案都对应一个位置 $$

UOJ #751. 【UNR #6】神隐

存在相邻的两条边:必须有询问只有第一条边没有第二条边,且有询问只有第二条边没有第一条边。
考虑故技重施。vi 表示 i 被询问的位置,每个 vi 的 popcount 为 lim/2
对于一条边 (u,v) 若存在,那么其必定在一个连通块出现 lim/2 次。否则必定少于 lim/2 次。
然后你只需要找合法的 (u,v) 即可。暴力是 O(n2lim) 的。考虑还有没有别的信息没有利用。
考虑构造树的常见方法删叶子。对于一个叶子那么其一定在 lim/2 次询问中都为孤立点。
可以不断删叶子,每次在连通块中删点即可。但是我们无法立刻知道一个点的父亲。
我们在一个连通块删除的只剩下一个点 x 时,显然 x 是最浅的。我们考虑 x 的儿子。
那么在过这个连通块的节点肯定都在 x 的子树中,此时取出还没有父节点的点,它们的父节点设为 x 即可。

AT_cf17_final_f Distribute Numbers

观察 i<j|SiSj|,有两种表示方法,一种是因为 |SiSj|=1,所以是 12n(n1)
一种是对于每个位置会贡献到 12k(k1)|SiSj|,所以是 12nk(k1),那么 n=k2k+1
那么我们先考虑选一个点,然后连出 k 个大小为 k1 的互不相交”团“。此时所有 n 个位置已经被覆盖。
设此时第 i 个团第 j 个元素为 (i,j)0i<k,1j<k)。
此时接下来的每个团都必须以上 k 个团选一个点。
考虑 (0,i) 每个点连的团。设 (0,i) 这个点连的第 j 个团是 Si,j1i<k,1j<k)。
所以 Si,j,Si,k 互不相交 (kj)Si,j,Sk,l 的交为 1ik)。钦定 k1 是质数。
那么 Si,j={(p,(j+ip)mod(k1)+1)|p[1,k1]} 即可。
显然 Si,j,Si,k 永不相交;因为 k1 是质数,且两个一次函数斜率不同,Si,j,Sk,l 必定存在一个位置相交。
我的理解是这种构造没有头绪的话是先钦定”第一个“是怎么构造的,后面再完善。

qoj # 8130. Yet Another Balanced Coloring Problem

首先考虑两棵树分开,然后以子树形式划分子任务。我们不着急给点着色而是等必须要染的时候再决定。
合并子树时,如果出现两个未经处理的叶子,那么就给这两个叶子间连一条边,代表这两个叶子颜色不同。
然后建出两张图。每张图里面都只有长度为 1 的链,那么两张图合并起来只有偶环。
然后偶环是二分图,所以必定有解。

计数

ARC170C Prefix Mex Sequence

状态设计一个很麻烦的点就是要表示当前 mex 是什么。但是发现这是不必要的。
Ai=mex(A1i1) 只会使种类 +1,所以我们只需要记录当前元素种类数即可。

CF1750F Majority

首先 s1=sn=1。观察样例我们发现应该统计不合法的方案数可能比较容易。
考虑观察一个不合法解经过若干次操作后卡住的形式。那么此时任意相邻的两段 1 都不能合并。
即如果画成折线图,每个 1 的高度是递减的。现在相当于给每种非法解分类,然后计数。
考虑一个卡住的情况如何变成一个非法解。发现对于 1 的连续段是子任务的形式。然后我们可以 dp。
dpi,j 表示 i 个位置,最后一段 1 的连续段长度为 j 的非法解方案数。最后一段 1 的贡献是 2j2dpj,
考虑 dpi,j 从哪里转移。若从 dpk,l 转移需要满足 l+k<i2j。那么做一个前缀和优化即可。
由于转移是有阶段性的,我们不用实时维护前缀和数组。只需要到下一个阶段重新做即可。

posted @   s1monG  阅读(1)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示