构造题做题记录

构造题一个很显著的特点就是高自由度,也就是说一道题的构造方式可能有很多种,但是会有一种较为简单的构造方式满足题意。看起来是放宽了要求,让题目变的简单了,但很多时候,正是这种高自由度导致题目没有明确思路而无从下手。
构造题另一个特点就是形式灵活,变化多样。并不存在一个通用解法或套路可以解决所有构造题,甚至很难找出解题思路的共性。

以上内容来自 oi-wiki。

最近发现随便一个 CF *2000 的构造我都不会做了,所以开了个坑。

关于难度

可以秒杀的题。

思考一会儿后可以秒的题。

需要较长时间思考的题。

看题解、稍加指点就会做的题。

看题解后需要较长时间消化,甚至现在都没有完全理解的题。


CF1276C *2300

我们称一个矩阵是美丽的,当且仅当该这矩阵中不存在两个相同的数在同一列或在同一行。
给定 n 个数,要求你选出尽量多的数,使它们能够组成一个美丽的矩形。
构造方案,n4×105

考虑如果只填一种数,咋填可以满足条件。

显然斜着填是一种很好的方式。

考虑斜着一个数最多能放多少个,于矩形的宽有关。

矩形的宽 n ,所以可以枚举。

假设当前宽为 m ,那么最多能放 min(cnti,m) 个数,cnti 表示 i 的出现次数。

找个最大值,现在考虑构造方案。

一个简单的想法是这样构造:

qNyJET.png

相同的数相邻放,这样很优,而且一定可以填满。

但这样会有一个问题了,如果有一个数出现 m 次,那么会出现这种情况:

qNyyVK.png

这样会有一列有两个相同的数。

咋处理呢?很简单,把出现 m 次的数全部放最前面,这样就不会有一个数字被拆到两条斜线上的情况

code


CF1552E *2300

n×k 个格子,编号从 1n×k,染成 n 种颜色,每种颜色恰好 k 个。
构造 n 个区间,第 i 个区间 [ai,bi]
满足 1ai<bin×k.
ai 个和第 bi 个格子的颜色都是 i
每个格子被包含不超过 nk1 次。
n,k100

考虑每个格子不超过 nk1,那么把 k1 中颜色变成一组,那么相当于对于每组来说每个格子最多覆盖一次。

考虑贪心,如果一个格子可以与前面匹配,那么必然匹配,这样对后面的贡献最优,然后把已经被覆盖的格子向后跳即可。

code


ARC138D *2083

已知 nk ,求构造一个 0...2n1 的排列,使得相邻两数异或值的二进制位上有 k1
n,k18

这题评分不应该这么低啊。有原题,所以场上大部分通过此题的都是中国人。。

其实还是很好的一个题,考虑 k=1 时是个经典的东西 格雷码,可以直接构造。

如果 k 是偶数或者 k>n 显然无解。

考虑格雷码每次操作使得每两个相邻的值相差一位,那么只需要把这个一位换成 k 位二进制数即可,一个思路是把所有二进制位上有 k1 的数拿出来。

由于需要构造出 0..2n1,可以发现线性基中的数恰好可以凑出所有的数。

所以先跑一边格雷码,然后把线性基中的数记录一下,格雷码上一个 1 就表示异或上线性基中第几个数即可。

code


posted @   houzhiyuan  阅读(239)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
主题色彩