ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【YbtOJ#20068】连通子图

2020-10-19 19:00:52  阅读:278  来源: 互联网

标签:rt 连通 log int YbtOJ 子图 20068 dfs tot


题目

题目链接:http://noip.ybtoj.com.cn/contest/102/problem/2

输入保证答案一定存在,你输出的 \(n\) 必须是正整数且不得超过 60。对每个询问,你只需要输出任意一个合法解即可。

思路

考虑已知的一个以 \(x\) 为根的有 \(k\) 个与 \(x\) 连接的连通块,此时如果我们给 \(x\) 加一个儿子,那么连通块数量变成 \(2k\);如果加上一个父亲 \(y\),那么以 \(y\) 为根的连通块就有 \(k+1\) 个。
那么任意一个数 \(x\) 都可以通过 \(2\log x\) 次操作得出,所以最多需要使用 \(2\log(10^9)\leq 60\) 次操作。
时间复杂度 \(O(T\log n)\)。

代码

#include <bits/stdc++.h>
using namespace std;

const int N=65;
int n,m,tot,ans[N][2];

void dfs(int k,int rt)
{
	if (k==1) return;
	ans[++m][0]=rt; ans[m][1]=++tot;
	if (k&1) dfs(k-1,tot);
		else dfs(k/2,rt);
}

int main()
{
	freopen("b.in","r",stdin);
	freopen("b.out","w",stdout);
	while (scanf("%d",&n)!=EOF)
	{
		m=0; tot=1;
		dfs(n,1);
		printf("%d\n",m+1);
		for (int i=1;i<=m;i++)
			printf("%d %d\n",ans[i][0],ans[i][1]);
	}
	return 0;
}

标签:rt,连通,log,int,YbtOJ,子图,20068,dfs,tot
来源: https://www.cnblogs.com/stoorz/p/13842029.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有