首页 > 其他分享 >构造题选讲 by_chance

构造题选讲 by_chance

时间:2024-04-29 15:24:54浏览次数:37  
标签:10 题选 frac submission 可以 构造 chance 考虑

不知道会不会有方法论,先咕了。

upd:有的捏,但是好像没啥用/qd

ARC145D Non Arithmetic Progression Set

首先考虑如何构造 \(n\) 个数满足不存在 \(2y=x+z\)。

考虑一个分治:将值域均匀分成三部分,并且让所有数平分在第一部分和第三部分,直至为 \(1\) 就可以在值域内选一个位置扔进去。

这个合法的原因是因为,考虑三个数被分开的时候,肯定是其中两个在其中一部分,另一个在另外一部分。在同一部分的两个的差小于值域 \(\frac{1}{3}\),并且和另一个的差大于 \(\frac{1}{3}\),因此不存在 \(2y=x+z\)。

另一个本质相同的构造方法是选择所有在三进制下只有 \(0\) 和 \(2\) 的数。

上面这个东西的值域不会超过 \(4\times 10^6\),可以接受。

然后考虑满足 \(m\) 的限制。一个可以观察到的事情是将整体加上一个数是不改变条件的,因此我们只需要在两边留 \(10^6\) 的余量,然后满足总和和 \(m\) 在 \(\bmod n\) 意义下同余即可。

用上面的方法构造 \(n-1\) 个数,放在 \([1\times 10^6,5\times 10^6]\) 区间,然后再在 \(\leq -5\times 10^6\) 的位置找一个数调整成同余,最后整体减即可。

submission

LG P10311 「Cfz Round 2」Weighted Mean

唐完了给我(

假设能枚举这个最终的值,记作 \(w\),那么移项发现,我们需要做的就是让 \(\sum\limits_{i} (a_i-w)b_i=0\)。

我们直接让 \(w\) 取中位数,若 \(n\) 是奇数,则可以直接取中位数,然后让 \(i\) 与 \(n-i+1\) 抵消。因为这样 \(b\) 可以划分成两个上升序列,所以只会有两个位置相同。

如果 \(n\) 是偶数并且两个中位数并不是挨着的,那么仍然可以按照上面的方法构造。

否则,\(n=2\) 无解。不妨设 \(2a_{\frac{n}{2}}\leq m\),如果不满足可以将 \(a\) 值域 reverse 一下。

先不管 \(a_{\frac{n}{2}+1}\) 的,先把 \(2\leq i\leq \frac{n}{2}-1\) 的 \(i\) 和 \(n-i+1\) 按照上面的方法配对掉。然后剩下 \(1,\frac{n}{2}+1,n\)。

我们让 \(b_1=a_n-a_{\frac{n}{2}}+2\),\(b_{\frac{n}{2}+1}=2b_n=2(a_{\frac{n}{2}}-a_1)\),满足了和为 \(0\) 的限制。

而 \(b\) 仍然是两个上升的子序列,并且前面的假设确保了 \(2(a_{\frac{n}{2}}-a_1)\leq m\),因此构造是可行的。

submission

ARC172D Distance Ranking

哥们,这种题怎么想到的?

我们希望可以对边长有足够大的区分度。直接给构造:

\(A_{i,i}=10^8\),\(A_{i,j}(i<j)\) 为 \(i\) 与 \(j\) 的距离从大到小的排名。

这个东西的正确性在于,\(i\) 与 \(j\) 的距离的形式是 \(L^2+(L-rk_{i,j})^2\) 再加上一堆小量。小量可以不管,\((L-rk_{i,j})^2=L^2-2rk_{i,j}L+rk_{i,j}^2\) 中 \(rk_{i,j}^2\) 也是一个小量可以扔了,因此 \(i\) 与 \(j\) 距离可以看成 \(-2rk_{i,j}L\),这是满足条件的。

这个近似属实有点逆天了。

submission

IMO2022T6 上山岗

by_chance:这题当时中国队六个人全过了,应该不是很难吧!

首先我们考虑如何计算这个上坡路径方案数。考虑将所有数从小到大插入,走到这个点的方案数就是相邻的比其先插入的点的方案数之和。特别的,如果这个点是山谷那么本身自带一个。

那么一个下界是 \(1+2n(n-1)\),其中 \(1\) 是山谷数的下界,\(2n(n-1)\) 是考虑方格图上每个边,其至少转移了一种方案。

有点逆天的是,这个下界是可以取到的!

要取到这个下界,首先需要只有一个山谷,也即 \(1\)。另外,一个点需要要么是局部最大值,要么比周围三个大比另一个小。这相当于,我们要在网格图上选一个树,满足不在树上的点都是单点,这样我们可以随便定一个树上的点为 \(1\),然后 dfs 从 \(2\) 开始放,最后不在树上的点任意放即可。

增量构造一下,可以构造出来图长这样:

截图 2024-04-29 15-08-21

\(n\bmod 6=4\) 的情况需要往下和往右平移一下。

submission

LG P7921 [Kubic] Division

首先我们考虑倒着做。初始的时候有一堆数满足 \(\max<2\min\),然后你要每次合并两个数,仍然要满足上述条件,最后要求合并成 \(n\)。

一个简单的贪心是每次合并最小值和次小值,但是仔细思考一下,17 25 29 32 32 32 32 上会寄。

但是实际上在这个题不会寄,因为可以存在一种最优策略,满足真的每次合并最小值和次小值就行的。考虑如果有一次没有合并最小值 \(x\) 和次小值 \(y\),而是合并了更大的 \(z\),则要满足 \(x+z<2y\)。这时我们在分裂 \(x+z\) 的时候不妨分裂成 \(y\) 和 \(x+z-y\),这样合并最小值和次小值就可以了。

现在我们考虑一下每次合并最小值和次小值,这个序列要满足什么性质。首先肯定不能有连续的四个相同的数,其次如果有三个相同的数,则比这个数小的数的个数要为奇数。同时我们发现合并完一轮后所有的数都互不相同的,因此只要能合并完一轮,剩下的就可以继续合并下去。所以上面的条件就是充要条件了。

因为 \(3\) 要求前面有奇数个,也就是说前面至少要有一个数只选了一次,则我们将 \(1,3\) 替换成 \(2,2\) 会让总和更小,因此 \(3\) 只能拿来调整总和,而不能拿来增加个数。

枚举一个 \(x\),假设当前值域是 \([x,2x-1]\)。从小到大填直到填不下去为止,这时 \(n<2x-1\)。如果剩下 \(\geq 2\) 个空位,则将前面的调整到空位上就可以将 \(n\) 调整掉。如果剩下一个空位,则至多只能调整 \(x-1\) 个,也即剩下的 \(n\) 要求 \(\leq x-1\)。如果没有剩下空位,那么至多只能让 \(x\) 选一个,让 \(2x-1\) 选三个,这样能增加 \(x-1\),而中间数显然都是可以构造到的。

又因为 \(x\) 越小,能构造的个数越多,所以只需要找到第一个 \(x\) 满足可以构造出 \(n\) 即可。时间复杂度 \(O(\sqrt n)\)。

submission

CF1882E Two Permutations

一个提示是考虑 SPJ 如何做到 \(O(n)\)。

考虑在开头新增一个 \(0\) 表示开头,并且将整个排列连成一个圆排列,则假设我们选择了 \(x\),原序列是 \(0AxB\),交换后变成 \(0BxA\)。因为是圆排列,所以这相当于 \(xA0B\),所以这个操作相当于交换了 \(0\) 和 \(x\)。

枚举 \(0\) 最终在哪,则最终序列确定。每个点有一个 \(p_i\) 表示其在最终序列中需要到的位置。这些 \(p_i\) 会形成若干个环。自环不用管,包含 \(0\) 的环需要环长 \(-1\) 步复位,否则需要环长 \(+1\) 步复位。

两个排列只需要分别对奇数和偶数计算最小答案即可。时间复杂度 \(O(n^2)\)。

submission

LG P8477 「GLR-R3」春分

首先我们可以发现这个东西至少可以做到线性:给每个溶液配一块板,这些板的反面都不用,这样就可以做到 \(2n\) 步了。

板的反面不用很浪费。我们考虑将左边的板重复利用一下:给右边的溶液每个溶液配一块板,左边的溶液用 \(\frac{n}{2}\) 块板,先将前 \(\frac{n}{2}\) 种溶液一个配一块板,后 \(\frac{n}{2}\) 种溶液用前面板的反面,这样就可以做到 \(1.5n\) 块板。

这样还可以分三组,这样可以做到 \(\frac{4}{3}n\) 块板,但是过程略有点逆天了。

我们考虑现在制约我们减少板数的地方在哪里:在我们使用左边后 \(\frac{n}{2}\) 溶液的时候,前 \(\frac{n}{2}\) 溶液把右边的板的另一面污染了,使其不能重复利用。

但是我们可以在中间再加一块板,让左边无法污染右边啊!

对左边还是分两组,让一组用一面,右边分三组,并且配 \(\frac{2}{3}n\) 个板。设左边两组为 \(A_1,A_2\),右边为 \(B_1,B_2,B_3\),右边两组板为 \(C_1,C_2\)。

分以下六步:

  • \(A_1,B_1,C_1\)
  • \(A_1,B_2,C_2\)
  • \(A_1,B_3,-C_1\)
  • \(A_2,B_2,C_2\),这里中间板要换个面避免污染 \(C_2\) 干净的一面。
  • \(A_2,B_3,-C_1\)
  • \(A_2,B_1,-C_2\)

然后就是 \(\frac{n}{3}+1+\lceil\frac{n}{2}\rceil\),刚刚好是 \(609\)。

submission

标签:10,题选,frac,submission,可以,构造,chance,考虑
From: https://www.cnblogs.com/275307894a/p/18165760

相关文章

  • 构造函数的成员初始化列表
    为什么要初始化成员对于类成员是基础数据类型,例如int、char这些,构造对象时,成员不会被初始化,值是随机的。下面代码可以验证下:classA{public:A(){}voidshowMember()const{std::cout<<"a:"<<a<<std::endl;}private:inta;};int......
  • js的函数及无参与有参构造函数
    1.函数定义fuctionfn(str){//1.定义函数alert(str);}fn("测试方法");varfn1=function(str){//2.定义函数alert(str);}varfn2=fuction(f,str){f(str);}fn2(fn1,"方法作为参数");//函数可以作为方法传递参数2.无参构造:varperson=function(){alert("......
  • Occ中gce、GC、GCE2D构造对象的区别
    这三个名字很接近,不知道为何取名字这么容易误解。gce是构造产生gp_前缀的对象;GC是构造产生Geom_前缀的对象;GCE2D是构造产生Geom2d_前缀的对象。gce中有的类继承自gce_root;GC中有的类继承自GC_Root;GCE2D中有的类继承自GCE2d_Root。gce_root,GC_Root,GCE2d_Root中有一个gce_ErrorTy......
  • FasterViT:英伟达提出分层注意力,构造高吞吐CNN-ViT混合网络 | ICLR 2024
    论文设计了新的CNN-ViT混合神经网络FasterViT,重点关注计算机视觉应用的图像吞吐能力。FasterViT结合CNN的局部特征学习的特性和ViT的全局建模特性,引入分层注意力(HAT)方法在降低计算成本的同时增加窗口间的交互。在包括分类、对象检测和分割各种CV任务上,FasterViT在精度与图像吞吐......
  • C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造
    C++构造函数构造函数是C++中一种特殊的成员函数,当创建类对象时自动调用。它用于初始化对象的状态,例如为属性分配初始值。构造函数与类同名,且没有返回值类型。构造函数类型C++支持多种类型的构造函数,用于满足不同的初始化需求:默认构造函数:不带参数的构造函数,通常用于初......
  • 构造顺序表并进行基础操作
    //定义顺序表中的元素的数据类型,用户可以根据需要进行修改typedefintDataType_t;//构造记录顺序表SeqList各项参数(顺序表的首地址+顺序表的容量+顺序表中最后有效元素的下标)的结构体typedefstructSeqList{DataType_t*Addr;unsignedintSize;int......
  • 默认构造函数学习
    转自:https://blog.csdn.net/sevenjoin/article/details/88314531,讲的很好。1.介绍若针对一个类没有显式地定义构造函数,那么编译器会隐式的为这个类生成一个默认构造成员函数。 默认构造函数就是在调用时不需要显示地传入实参的构造函数。假如用户定义了其他构造函数(比如有参数......
  • 【根据前序和中序遍历构造二叉树】栈+迭代 || 递归
    105.从前序与中序遍历序列构造二叉树栈+迭代规律前序遍历中相邻节点u和v,v节点一定是u节点的左节点或者是其自身某个祖先的右节点一个没有右节点的链,中序遍历是从叶子到根,前序遍历是从根到叶子解题思路用一个栈维护前序遍历的节点用一个指针p指向中序遍历的第一个叶子节......
  • ATCF 杂题选讲 LHF
    CF1329DDreamoonLikesStrings将原序列中\(s_i=s_{i+1}\)的位置拿出来,记这些位置的集合为\(S\)。考虑我们选择\(S\)相邻两个数,并且删除中间这一段会产生什么影响。如果两边的数不同,那么这两个位置都会在\(S\)中消失,否则,会在\(S\)中新加入一个为这个数的位置。我们总......
  • python多继承构造方法参数报错
    各路大神,今天下午在学习Python3.12多继承的时候,有个构造方法一直报错,希望大家能帮忙瞅瞅,求求了~~~~~~~代码如下:点击查看代码classRectangle:def__init__(self,width,height):self.width=widthself.height=heightdefarea(self):......