首页 > 其他分享 >[CF566E] Restoring Map

[CF566E] Restoring Map

时间:2023-10-30 22:22:06浏览次数:34  
标签:tmp Map CF566E int 类点 long include Restoring define

Restoring Map
星空蚁来了秒了。
人与人的智力是有差距的。
刷再多的CF智力不行就是不行。
OI这种需要智力的游戏不适合我。
我还是更适合对智力要求低一点的。
比如和妹子贴贴。
但是也没有妹子。
life is hard.
这类树的构造似乎可以从边缘情况想起,比如 CF1844G
但是这个题从叶节点(称为2类点)开始想就寄了。
我们把点 x 的集合称为 \(S_x\)
考虑观察非叶节点(称为1类点)是否直接连边的性质,称直接相连的两点为 x,y。
那么我们可以找出一条形如 a-x-y-b 的链,则 \(S_a\cup S_b=\left\{x,y\right\}\)
不难证明该条件充要。
对于1类点个数 \(\geq\) 3个的,我们可以把所有1类点找出来,这些点首先需要连边。
再考虑所有2类点,其能连到的1类点为其父亲和爷爷,找出集合包含当前2类点的那个即可(如果都有就随便,这说明两者父子关系不定)
对于只有1个1类点,构造一个菊花图即可。
对于2个1类点,这时所有2类点分成两部分,相同集合的必须连同一个点,这个也很好判断。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<bitset>
using namespace std;
#define mp make_pair
#define db double
#define ll long long
#define ull unsigned long long
#define ld long double
#define b1t bitset
typedef pair<int,int> kk;
void read(int &x){
	x=0;int f=1;char s=getchar();
	while(s<'0'||s>'9'){
		if(s=='-') f=-1;s=getchar();
	}
	while(s>='0'&&s<='9'){
		x=(x<<3)+(x<<1)+(s^48);s=getchar();
	}
	x*=f;
}
const int MAXN=1005;
int n;
b1t<MAXN> a[MAXN],b[MAXN],ye;
bool pd,vis[MAXN];
vector<kk> res;
int main(){
	read(n);
	pd=1;
	for(int i=1,op,x;i<=n;i++){
		read(op);
		pd&=(op==n);
		while(op--)
			{read(x);
			a[i][x]=1;
		}
	} 
	if(pd){
		for(int i=2;i<=n;i++) printf("%d %d\n",1,i);
		return 0;
	} 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			b1t<MAXN> tmp=a[i]&a[j];
			if(tmp.count()==2){
				int x=tmp._Find_first(),y=tmp._Find_next(x);
				if(b[x][y]) continue;
				b[x].set(y);b[y].set(x);ye[x]=ye[y]=1;
				b[x][x]=b[y][y]=1;res.push_back(mp(x,y));
			}
		}
	}
	if(ye.count()==2){
		int o1=0,o2=0;
		for(int i=1;i<=n;i++){
			if(ye[i]){
				if(!o1) o1=i;
				else{
					o2=i;break;
				}
			}
		}
		for(int i=1;i<=n;i++){
			if(a[i].count()<n){
				for(int j=1;j<=n;j++){
					if(!ye[j]&&a[i][j]) vis[j]=1;
				}
				break;
			}
		}
		for(int i=1;i<=n;i++) if(!ye[i]){
			if(vis[i]) res.push_back(mp(o1,i));
			else res.push_back(mp(o2,i));
		}
		for(auto u:res) printf("%d %d\n",u.first,u.second);
		return 0;
	}
	for(int i=1;i<=n;i++){
		pd=1;
		for(int j=1;j<=n;j++){
			if((a[i]&a[j])==a[j]&&a[i]!=a[j]){pd=0;break;}
		}
		if(!pd) continue;
		b1t<MAXN> tmp=a[i]&ye;
		for(int j=1;j<=n;j++){
			if(tmp[j]&&b[j]==tmp){
				if(!vis[j]){
					for(int k=1;k<=n;k++){
						if(!ye[k]&&a[i][k]) res.push_back(mp(j,k));
					}
					vis[j]=1;
				}
				break;
			}
		}
	}
	for(auto u:res) printf("%d %d\n",u.first,u.second);
	return 0;
}

标签:tmp,Map,CF566E,int,类点,long,include,Restoring,define
From: https://www.cnblogs.com/StranGePants/p/17798905.html

相关文章

  • [CF566E]Restoring Map
    题目描述ArchaeologistsfoundsomeinformationaboutanancientlandofTreeland.WeknowforsurethattheTreelandconsistedof$n$citiesconnectedbythe$n-1$road,suchthatyoucangetfromeachcitytoanyotheronealongtheroads.However,thei......
  • 快速编译QCMAP方法
    快速编译QCMAP方法:step1:cd/fibocom/huangguanyuan/sa522/sa525m_le/SA525M_apps/apps_proc/pokystep2:DISTRO=qti-distro-tele-debugMACHINE=sa525msourceqti-conf/set_bb_env.shstep3:bitbakesystemd|tee-abuild_systemd_log.txtbitbakedata|tee-ab......
  • Hadoop三大组件(HDFS,MapReduce,Yarn)
    1、HDFSHDFS是Hadoop分布式文件系统。一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件的访问操作;集群中的DataNode管理存储的数据。2、MapReduceMapReduce是一个软件框架,基于该框架能够容易地编写......
  • 2.手写map
    我们首先先创建一个index.js的文件在文件中定义一个数组,就像这样letarray=[10,20,30];array.map((item)=>console.log(item));使用nodeindex.js运行这段代码,我们可以看到输出的结果是102030现在让我们来实现自己的map方法吧letarray=[10,20,30];//与fo......
  • 关于mapStruct-高阶用法
    描诉:符合应用场景的实用的mapStruct对于bean映射的方法1.使用自定义转换器(Converters):如果你需要自定义映射逻辑,可以创建自定义转换器类,并使用@Mapper注解的uses属性来引用它们。这允许你在映射中使用自定义方法,以满足特定需求.@Mapper(uses={CustomConverter.class})public......
  • 按Value对Map进行排序,技术大佬们都在用这个方法
    在Java中,Map的排序一般会根据Key或者Value来进行。按照Value对Map进行排序,通常会用在以下几种场景。1.数据可视化:如果你正在创建一个数据可视化工具,你可能会需要根据数据的值来进行排序。例如,你可能有一个表示员工工资的Map,你想要根据工资值来对员工进行排序,并在图表中展示。2.......
  • Optional.ofNullable()方法, 参数list或者map如果为null执行 ofNullable(创建个新对象
    Optional.ofNullable()方法举个栗子publicstaticvoidmain(String[]args){List<String>list=null;list.forEach(x->System.out.println(x));}工作中经常会遇到,查询返回空,如果没有判空处理,一不小心就会空指针异常。加上if判断处理也可以,但是jdk1.......
  • 信号量Semaphore的使用
    Semaphore是jdk中提供的用来限制资源可以同时被几个线程访问的工具类,它底层也是用aqs实现的。以现实生活中停车场的例子来举例,一个停车场总的车位数是固定的,@Slf4jpublicclassThreadTest4{publicstaticvoidmain(String[]args){//假设只能停两辆车......
  • std::map和std::unordered_map
    区别std::map和std::unordered_map是C++标准库中的两个容器,用于实现键值对的关联。它们之间的主要区别在于底层实现和性能特征。底层实现:std::map是基于红黑树(一种平衡二叉搜索树)实现的有序映射容器,而std::unordered_map是基于哈希表实现的无序映射容器。排序:std::map中的......
  • HashMap集合遍历随机性问题分析
    一、原因分析1.1HashMap对象的遍历HashMap的遍历是通过此类中字段table数组进行顺序遍历,原因如下所示:1#HashMap迭代遍历源码2publicfinalbooleanhasNext(){3returnnext!=null;4}56finalNode<K,V>nextNode(){7Node<K,V>[]t;......