构造专题 1

news/2025/2/22 0:34:43/文章来源:https://www.cnblogs.com/XP3301Pipi/p/18727889

Problem A. [CF1198C] Matching vs Independent Set

Description

给定一张 \(3n\) 个点 \(m\) 条边的无向图,在以下任务中选择其一完成:

  1. 找到一个大小为 \(n\) 的独立集;
  2. 找到一个大小为 \(n\) 的匹配。

\(n \leq 10^5,m \leq 5\times 10^5\)

Solution

猜测一定有解。

\(3n\) 个点这个限制很奇怪。注意到独立集最多有 \(n\) 个点,匹配最多占据 \(2n\) 个点,加起来正好是 \(3n\)

首先尝试构造匹配。枚举每一条边,如果其两端都没有标记,就将其加入到匹配中,并标记两端。

如果匹配大小已经达到 \(n\),那么就结束了。

否则,剩下未被标记的节点数量 \(>n\),且一定是一个独立集。考虑反证,如果剩下的点集中存在一条连边,那么其一定会被加入到匹配中。

Problem B. [CF618F] Double Knapsack

Description

给定序列 \(A,B\),分别找出 \(A,B\) 的一个子集 \(S,T\),使得 \(Sum(S)=Sum(T)\)

\(n \leq 10^6,1 \leq A_i,B_i \leq n\)

Solution

子集数量为 \(O(2^n)\),但是和不同的子集数量只有 \(O(n^2)\),看上去很不平衡。

转化一下题意:重排 \(A,B\) 并找出和相等的两个子段。

大胆猜测,对于任意一个 \(A,B\),必定存在满足条件的子段。

\(A,B\) 分别求前缀和数组 \(Sa,Sb\)

首先如果 \(Sa_n>Sb_n\),那么交换 \(A,B\)\(Sa,Sb\)。现在 \(Sa_n \leq Sb_n\)

每一个 \(i\) 都能找到一个 \(j\),使得 \(Sb_j\geq Sb_i\)

那么我们对于每一个 \(i\),找到一个最小的 \(j\),使得 \(Sb_j\geq Sa_i\)。由于序列中每个数字都在 \([1,n]\) 之间,那么 \(Sb_j-Sa_i \in [0,n-1]\)

\(i\) 可以取遍 \([0,n]\),共有 \(n+1\) 个位置,但 \(Sb_j-Sa_i\) 只有 \(n\) 种取值。根据鸽巢原理,一定有两个差会相等。

假如这两个 \(i\) 分别为 \(i_1,i_2\),那么有 \(Sa_{i_1}-Sb_{j_1}=Sa_{i_2}-Sb_{j_2} \Leftrightarrow Sa_{i_1}-Sa_{i_2}=Sb_{j_1}-Sb_{j_2}\)

于是我们找到了 \(A[i_1,i_2]\)\(B[j_1,j_2]\) 两个合法的子段。

用证明中的方法构造即可。

Problem C. [CF1325F] Ehab's Last Theorem

Description

给定一张 \(n\) 个点,\(m\) 条边的简单无向连通图。设 \(k=\lceil \sqrt{n}\rceil\)从以下任务中选择其一完成:

  1. 找到一个长度 \(\geq k\) 的环;
  2. 找到一个大小 \(=k\) 的独立集。

\(n,m \leq 2\times 10^5\)

Solution

猜测一定有解。

首先构造环。我们把问题放到 dfs 树上来考虑。

一个重要性质:无向图的 dfs 树上没有横叉边。那么我们只需考虑返祖边。

假如我们遍历到了 \(x\),一条返祖边为 \((x,y)\)。如果 \(dep_x-dep_y+1\geq k\)\((y \rightarrow x \rightarrow y)\) 就是一个合法的环。

如果没有找到合法的环,那么对于任意的 \(x\) 以及其返祖边连接的 \(y\),一定有 \(dep_x-dep_y+1 \leq k-1\)。由于没有重边,那么 \(x\) 的返祖边数量不超过 \(k-3\)(考虑从大小为 \(k-1\) 的环中除去自己和父亲)。

我们从叶子开始,从底至顶构造独立集。如果这个点没有被标记,那么将其加入独立集,并标记自己以及相邻的节点。可以发现,这样构造每次加入的点一定没有未被标记的儿子。

那么我们每次最多标记 \(k-1=\lceil \sqrt{n}\rceil-1\leq \lfloor\sqrt{n} \rfloor\) 个节点。

如果等号成立,那么结束;否则一定还剩下至少一个点,将其加入独立集即可。

void dfs(int x,int pr){dep[x]=dep[pr]+1;s[++cnt]=x;for(int i=head[x];i;i=edge[i].nxt){int t=edge[i].to;if(!dep[t]) dfs(t,x);else if(dep[x]-dep[t]+1>=k){printf("2\n%d\n",dep[x]-dep[t]+1);for(int j=dep[t];j<=dep[x];j++)printf("%d ",s[j]);puts(""); exit(0);}}if(!vis[x]){vis[x]=1;for(int i=head[x];i;i=edge[i].nxt)vis[edge[i].to]=1;S.push_back(x);}cnt--;
}

Problem D. [CF1470D] Strange Housing

Description

给定一个 \(n\)个节点,\(m\) 条无向边的图,现在你要给一些点染色,使得:

  • 一条边所连接的两个点不能都被染色。
  • 在所有连接两个不被染色的点的边都被删除的情况下,这个图满足任意两个点互相可达。

\(n,m \leq 3\times 10^5\)

Solution

题意转化为:将点集拆为两个集合 \(S,T\),满足 \(S\) 为一个独立集,且 \(T\) 中的点均与 \(S\) 中的点有连边。

猜测如果图联通,一定有解,否则无解。

我们从任意一点出发,类似于二分图染色地做 dfs。选入 \(S\) 标记为 \(1\),否则为 \(0\)

如果点 \(x\) 标记为 \(1\),那么 \(x\) 的所有邻居都必须标记为 \(0\)。我们先把 \(x\) 未被标记的邻居拿出来,先一块标记为 \(0\),再继续进行 dfs。

如果点 \(x\) 标记为 \(0\),那么我们遍历 \(x\) 的所有邻居 \(y\),如果 \(y\) 未被标记,那么把 \(y\) 标记为 \(1\),进入 \(y\) 继续 dfs。

首先这样保证了每个标记为 \(0\) 的点都至少有一个标记为 \(1\) 的邻居。当 \(x\) 被标记为 \(1\) 时,它会立即把所有邻居标记为 \(0\),又保证了 \(S\) 为独立集。

void dfs(int x){if(col[x]==1){S.push_back(x);vector<int> T;for(int i=head[x];i;i=edge[i].nxt){int t=edge[i].to;if(col[t]==-1) T.push_back(t),col[t]=0;}for(int i:T) dfs(i);}else{for(int i=head[x];i;i=edge[i].nxt){int t=edge[i].to;if(col[t]==-1){col[t]=1;dfs(t);}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/887363.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DP优化

# DP优化 动态状态 一个转移只用到很小的一部分状态,则不断刷新状态,使得其只与我需要的同阶。 例题:P3188 [HNOI2007] 梦幻岛宝珠 前缀和优化 就是枚举的值存下来,以防止重复的枚举。 例题:2024.10.3T3 Kanade的水杯60分 路径化DP 将一个二维的、仅仅是在相邻位置进行转移…

DelayQueue的take方法底层原理

一、DelayQueue的take()方法底层原理 DelayQueue 的 take 方法是其核心方法之一,用于从队列中获取并移除延迟时间到期的元素。如果队列为空或没有延迟到期的元素,调用 take 方法的线程会阻塞,直到有元素到期 1、take 方法的核心逻辑 take 方法的主要逻辑可以分为以下几个步骤…

【模拟电子技术】43-44-波形发生和转换电路

【模拟电子技术】43-44-波形发生和转换电路 利用正弦波和单限比较器,可以做出占空比可调的方波。但在这里老师用另一种思路来产生方波,利用滞回比较器,但是滞回比较器充放电的速度是很快的,我们需要利用电容来控制充放电速度,才可以控制时间周期T。波形中的T利用基础电路中…

tcp 串口并存客户端

需要用的包:把之前的tcp修改成控件 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using Syst…

使用streamlit创建一个产品指标与排名看板【2】创建一个使用sidebar+exec管理的多页面应用

1. Streamlit常见的多页面管理形式pages文件夹形式的多页面应用 switch_page或者page_link跳转 sidebar+exec形式开始时使用的方法1,使用文件结构和文件名称管理多页面,页面内容可以不需要为导航专门再写东西,非常便捷。随着使用,缺点也很明显,无法再定义导航栏中的页面名…

基于FOC控制器的BLDC无刷直流电机控制系统matlab编程与仿真

1.课题概述基于FOC控制器的BLDC无刷直流电机控制系统matlab编程与仿真,使用MATLAB编程实现,包括FOC控制器,clark,park等,不使用simulink建模。仿真输出三相电流,电机转速以及转子角度。2.系统仿真结果 3.核心程序与模型 版本:MATLAB2022a%矢场定向控制 function [A,B,C…

DelayQueue 底层原理

一、DelayQueue 底层原理 DelayQueue是一种本地延迟队列,比如希望我们的任务在5秒后执行,就可以使用DelayQueue实现。常见的使用场景有:订单10分钟内未支付,就取消。缓存过期后,就删除。消息的延迟发送等。但是DelayQueue是怎么使用的?底层原理是什么样的?如果有多个任务…

基于Affine-Sift算法的图像配准matlab仿真

1.算法运行效果图预览 (完整程序运行后无水印)Affine-Sift算法 Sift算法 2.算法运行软件版本 MATLAB2022A3.部分核心程序 (完整版代码包含操作步骤视频)figure; subplot(121);imshow(img1s);title(原始图片1); subplot(122);imshow(img2s);title(原始图片2); %计算图片的大…

【H2O系列】包括人形机器人WBC相关论文小结

1. 前言 这篇博客主要用于记录包括人形机器人WBC或locomotion相关论文小结。 一方面便于日后自己的温故学习,另一方面也便于大家的学习和交流。 如有不对之处,欢迎评论区指出错误,你我共同进步学习! PS:主要是备忘,不然看过就忘了。。。(汗 2. 正文 先看数据集或者说动捕…

设计测试用例方法-场景法

一、场景法: 场景法主要是针对测试场景类型的,也称场景流程分析法。 流程分析是将软件系统的某个流程看成路径,用路径分析的方法来设计测试用例。根据流程的顺序依次进行组合,使得流程的各个分支都能走到 案例1:购物流程案例2:离职流程案例3:atm机二、流程分析步骤: 1.画…

寒假工程5

对于每个项目,需要单独编写其相关工能 @Override public String toString() { return "Communication{" + "assessmentID=" + assessmentID + + ", consciousnessLevel=" + consciousnessLevel + ", visionLevel=" + visionLevel + …