首页 > 其他分享 >CF566E 做题记录

CF566E 做题记录

时间:2024-05-08 11:36:45浏览次数:13  
标签:记录 ll CF566E 特判 点集 叶子 maxn define

link

比较常规的一道构造题,练习自己的构造水平。

首先对于一条边 \((u,v)\),如果有边 \((x,u),(v,y)\),我们可以对 \(x,y\) 的距离不超过 \(2\) 的点集 \(S_x,S_y\) 进行求交 \(S_x\cap S_y\),结果恰好就是 \(\{u,v\}\)。

我们枚举两条信息,对两个集合求交,如果结果为两个点,那么这两个点之间连一条边。

注意当 \(n=2\) 时要特判。

但是如果没有 \(x,y\) 这两个点就不能判断。具体的,我们只能用这种方式连接所有非叶子,即度数 \(>1\) 的点。

这里有个隐藏的点,我们可以间接得知哪些点是叶子,哪些点不是叶子。

特别的,如果一条边都连不了,那么树是菊花图,特判掉。

接下来处理叶子,我们要给每个叶子找一个非叶子连接。

对于叶子 \(u\),我们可以找到点 \(u\) 对应的信息,为包含 \(u\) 的最小点集,即我们可以确定 \(S_u\)。枚举非叶子 \(v\),判定 \((u,v)\) 是否合法:

考虑处理出 \(to_v\) 表示与 \(v\) 距离 \(\le 1\) 的非叶点集,令 \(S_u'\) 为 \(S_u\) 去掉叶子后的点集,当 \(to_v\) 和 \(S_u'\) 完全相同时合法。

有个值得思考的点:如果有多个信息满足点集包含 \(u\),且都是最小的,说明 \(v\) 下面挂着的叶子不止 \(u\),进而可知这些集合长得都一样。

但是过不了样例 2,原因是存在两个非叶子 \(v_1,v_2\),满足 \(to_{v_1}\) 和 \(to_{v_2}\) 相同。

仔细思考一下,发现只有非叶子个数为 \(2\) 的情况才会出现这种情况,特判即可。

显然 bitset 优化,时间复杂度 \(O(\dfrac {n^3} \omega)\)。

启示:

  • 循序渐进,步步思考

  • 列清思路列表,理清特判点

  • 比较发散,一定要肯思考,不要轻易放弃

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define fi first
#define se second
#define pir pair<ll,ll>
#define mkp make_pair
#define pb push_back
using namespace std;
const ll maxn=1010, inf=8e18;
ll n, tot, lf[maxn], vis[maxn];
bitset<maxn> mp[maxn], to[maxn], unlf_mp[maxn], tmp;
int main(){
	scanf("%lld",&n);
	if(n==2) {puts("1 2"); return 0;}
	for(ll i=1;i<=n;i++){
		ll m, x; scanf("%lld",&m);
		tot+=m;
		while(m--){
			scanf("%lld",&x);
			mp[i][x]=1;
		}
	}
	if(tot==n*n){
		for(ll i=2;i<=n;i++) printf("1 %lld\n",i);
		return 0;
	}
	for(ll i=1;i<=n;i++) lf[i]=1;
	for(ll i=1;i<=n;i++)
		for(ll j=i+1;j<=n;j++){
			tmp=mp[i]&mp[j];
			if(tmp.count()==2){
				ll x=tmp._Find_first(), y=
				tmp._Find_next(x);
				to[x][y]=to[y][x]=1, lf[x]=lf[y]=0;
			}
		}
	ll cnt=0;
	for(ll i=1;i<=n;i++)
		for(ll j=i+1;j<=n;j++)
			if(to[i][j]) printf("%lld %lld\n",i,j), ++cnt;
	if(cnt==1){ ll x=0, y=0;
		for(ll i=1;i<=n;i++)
			if(!lf[i]) vis[i]=1, y=x, x=i;
		for(ll i=1;i<=n;i++)
			if(mp[i].count()<n){
				for(ll j=1;j<=n;j++)
					if(lf[j]&&mp[i][j])
						vis[j]=1, printf("%lld %lld\n",j,x);
				break;
			}
		for(ll i=1;i<=n;i++)
			if(!vis[i]) printf("%lld %lld\n",i,y);
		return 0;
	}
	for(ll i=1;i<=n;i++) unlf_mp[i]=mp[i], to[i][i]=1;
	for(ll i=1;i<=n;i++)
		for(ll j=1;j<=n;j++)
			if(lf[j]) unlf_mp[i][j]=0;
	for(ll i=1;i<=n;i++)
		if(lf[i]){ ll id=0;
			for(ll j=1;j<=n;j++)
				if(mp[j][i]&&(!id||mp[id].count()>mp[j].count()))
					id=j;
			for(ll j=1;j<=n;j++)
				if(unlf_mp[id]==to[j]){
					printf("%lld %lld\n",i,j);
					break;
				}
		}
	return 0;
}

标签:记录,ll,CF566E,特判,点集,叶子,maxn,define
From: https://www.cnblogs.com/Sktn0089/p/18179328

相关文章

  • iOS pod删除某一个框架记录一下 eg: JMessage
    pod删除JMessage 提示没有找到 “jcore-ios” 在otherlinkerFlags 中删除 “jcore-ios” 删除后说没有找到“JMessage”继续删除  删除后问题出现了   提示没有找到coreimage 很奇怪 根本没有动这个文件 继续删除问题更多,回去排查发现 -fram......
  • 创建个人博客网站记录-2.3 建立模型以及对应的CRUD操作
    2.3、建立模型以及对应的CRUD操作在本节中,创建了USER用户类和BLOG博文类两个对象类,并实现了其基本的增删改查的操作。#flaskr/models.pyfromflaskimportgfromflask_sqlalchemyimportSQLAlchemyfromsqlalchemyimportColumn,Integer,String,TIMESTAMP,ForeignKey,T......
  • 常用功能方法记录
    #region获取物料辅助操作记录分页数据///<summary>///获取物料辅助操作记录分页数据///</summary>///<paramname="query"></param>///<returns></returns>publicasyncTask<PageModel<WoMaterialOperationRecorDTO>>GetWoMateri......
  • Quick Logger 强大的企业级异步记录器
    QuickLogger强大的企业级异步记录器这是一个用于在文件、控制台、内存、电子邮件、rest、事件日志、Syslog、slack、telegram、Redis、logstash、elasticsearch、influxdb、graylog、Sentry、Twilio上记录日志,并为DelphiFiremonkey(适用于Windows/Linux/OSX/IOS/Android)抛出......
  • .net 8中使用过滤器记录系统日志 ActionFilter+Serilog
    1、添加自定义日志过滤器类usingSerilog;usingMicrosoft.AspNetCore.Mvc.Filters;namespaceADTO.CMS.Common.Filter{///<summary>///日志记录过滤器///</summary>publicclassLogActionFilter:IActionFilter{///<summary>///......
  • AGC039F 做题记录
    link很厉害的一道Ad-hoc题!假定我们填写的矩阵为\(A\)。直接填写\(A\)计算贡献是基本做不到的,考虑挖掘一些神奇的东西。问题转化:考虑\(\prod\limits_{i=1}^n\prod\limits_{j=1}^mf(i,j)\)相当于构造另一个\(B\)矩阵,满足\(B_{i,j}\le\min(A_{i,1...m},A_{1...n,j})......
  • 云渲染实施记录(暂未跑通)
    大家好,本文记录了尝试跑通云渲染的过程,目前暂时没有跑通,不过已经有了方向目录基本原理1.租GPU服务器2.部署到云渲染平台未来方向更多参考资料相关文章:数字孪生云渲染整体架构设计本文尝试把基于WebGPU-Node的路径追踪渲染器部署到云端,以云渲染/云游戏的方式渲染到客户端,从而......
  • 10.3顺序表的初始化以及插入实战(早期学习笔记记录)
    命名规范1.下划线命名法list_insert不同的单词用下划线连接2.驼峰命名法ListInsert每个单词首字母大写一切数据结构考的都是增(插入)删查改插入思路1、判断插入位置是否合法1<=i<=lenthif(i<1||i>lenth){returnfalse;}2、判断储存空间是否已满(插入数据后......
  • 记录一下docker踩坑 /dev/shm目录
    /dev/shm是Linux系统中的一个特殊目录,用于作为临时文件存储的一种形式,它将数据存储在RAM(随机存取存储器)中,而不是在磁盘上。这意味着在/dev/shm中存储的数据访问速度非常快,但数据在系统重启后不会被保留。/dev/shm是POSIX共享内存(POSIXSharedMemory)的一部分,它允许不同的进程(程序......
  • C#中的记录(record)简介
    record是一种语法糖。标准的record用法有“recordclass”和"recordstruct"两种,分别表示记录类和记录构造。是“引用”和“值”的差别。单独使用record表示"recordclass"。语法:脱胎于构造函数。 recordPerson(stringXm,intNl); 或者recordPerson(stringXm,intNl)......