首页 > 其他分享 >[2020集训队论文] 最小连通块

[2020集训队论文] 最小连通块

时间:2023-05-28 22:46:28浏览次数:30  
标签:集训队 连通 int ak back st vector 2020 push

这是一道交互题。

交互库里有一棵 $n$ 个点的树,你可以通过做若干次如下询问来确定这棵树:

给定一个节点集合 $S$ 和节点 $x$,交互库会告诉你 $x$ 是否在包含 $S$ 的最小连通块中。

Details

具体的,你需要引用头文件 D.h 并且实现以下函数:

std::vector<std::pair<int,int> > work(int n)

这个函数接受一个节点数 $n$,返回一个 std::vector<std::pair<int,int> >,其中每个 std::pair<int, int> 都表示边的两个端点,且 vector 的长度恰好为 $n-1$。

你可以调用以下函数:

bool ask(std::vector<int> S, int x)

用途见题目描述。

Custom Test

下发文件包含 D.h 以及交互库的实现 implementer.cpp,评测程序示例将读入如下格式的输入数据:

第一行包括一个正整数 $n$。

接下来 $n-1$ 行,每行两个正整数 $x,y$,表示一条边的两个端点。下标从 $1$ 开始。

Constraints

对于所有数据,$n \le 1000$。并且设你在某个测试点中做了 $Q$ 次询问,则将获得 $\min\left\{\left\lfloor\dfrac{2.2\times10^6}{Q}\right\rfloor,100\right\}$ 分,总的得分是所有测试点得分的最小值。

注意:由于交互库处理询问的复杂度为 $O(|S|)$,因此你需要注意 $\sum |S|$ 的大小可能会引起超时。

$\text{subtask1(23pts)}:n=998$ 且树是一条链。

$\text{subtask2(33pts)}:n=999$ 且树上每个点 $i$ 的父亲在 $1,2,\cdots,i-1$ 中均匀随机。

$\text{subtask3(44pts)}:n=1000$,无特殊限制。

无根树不好做,先定一个根1.

通过询问,我们可以很轻松的判断出一个点是否为另一个点的祖先。

定义一个函数 \(f(x)\) 为把 \(x\) 的子树给建好

现在我们可以把所有 \(x\) 子树内的点都给递归解决掉,然后他的后代中所有没有父亲的父亲一定是 \(x\) 点。

问题来了,如何迅速找到一个在 \(x\) 子树中的点呢?我们可以二分,每次把二分到的点放入集合,然后再把1塞进去,询问 \(x\) 是否在其中就可以了。

而如何找到 \(x\) 子树中没连父亲的点也可以用同样的方法。那么就做完了。

略微卡常,可以卡的点包括:直接二分而不用整体二分会更少次数,每次询问二分前先判断一次整个区间是否存在这样的点。

#include"C.hpp"
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int p,q,n,st[N],nw[N],fa[N];
vector<pair<int,int> >ans;
vector<int>ak;
void del(int a[],int&n,int x)
{
	for(int i=1;i<=n;i++)
		if(a[i]==x)
			for(int j=i;j<n;j++)
				a[j]=a[j+1];
	--n;
}
void solve(int x)
{
	del(nw,p,x);
	while(1)
	{
//		puts("NO!!!");
		int l=1,r=p;
		ak.clear();
		for(int i=l;i<=r;i++)
			ak.push_back(nw[i]);
		ak.push_back(1);
		if(!ask(ak,x))
			break;
		while(l<r)
		{
			int md=l+r>>1;
			ak.clear();
			for(int i=l;i<=md;i++)
				ak.push_back(nw[i]);
			ak.push_back(1);
			if(ask(ak,x))
				r=md;
			else
				l=md+1;
		}
		if(l>p)
			break;
//		ak.clear();
//		ak.push_back(1);
//		ak.push_back(nw[l]);
//		if(!ask(ak,x))
//			break;
		solve(nw[l]);
	}
	while(1)
	{
//		puts("NO!!!");
		int l=1,r=q;
		ak.clear();
		for(int i=l;i<=r;i++)
			if(st[i]^x)
				ak.push_back(st[i]);
		ak.push_back(1);
		if(!ask(ak,x))
			break;
		while(l<r)
		{
			int md=l+r>>1;
			ak.clear();
			for(int i=l;i<=md;i++)
				if(st[i]^x)
				ak.push_back(st[i]);
			ak.push_back(1);
			if(ask(ak,x))
				r=md;
			else
				l=md+1;
		}
		if(l>q||st[l]==x)
			break;
//		ak.clear();
//		ak.push_back(1);
//		if(st[l]^x)
//			ak.push_back(st[l]);
//		if(!ask(ak,x))
//			break;
		fa[st[l]]=x;
		ans.push_back(make_pair(st[l],x));
		del(st,q,st[l]);
	}
}
vector<pair<int,int> >work(int n){
	::n=p=n;
	q=n-1;
	for(int i=1;i<=n;i++)
		st[i-1]=nw[i]=i;
	solve(1);
	return ans;
}

标签:集训队,连通,int,ak,back,st,vector,2020,push
From: https://www.cnblogs.com/mekoszc/p/17439040.html

相关文章

  • ANSYS 2020 R2 软件安装教程ANSYS 2020 R2 软件安装包下载
    [名称]:ANSYS2020R2[大小]:18.76GB[语言]:中/英文[适用系统]:win10,win11[简介]:ANSYS是融结构、流体、电场、磁场、声场分析于一体的大型通用有限元分析软件。[64位下载地址]:https://pan.baidu.com/s/1nt3RsQCYGx73yqYcZRMQQQ密码:jdv3安装有问题或需要远程安装请联系:人工客服安装步骤......
  • PyCharm 版本2020.3 如何设置默认的python版本 以及 对应的依赖镜像源
    要在PyCharm2020.3中设置默认的Python版本以及依赖镜像源,请按照以下步骤进行操作:设置默认的Python版本:打开PyCharm,并打开您的项目。点击菜单栏上的"File"(文件)选项,然后选择"Settings"(设置)。在弹出的窗口中,展开"Project:YourProjectName"(项目:您的项目名)。点击"ProjectI......
  • 河北工业大学 ACM 集训队 2023 年夏季选拔 题解 12/12
    https://ac.nowcoder.com/acm/contest/59007A假设数字n有len位则小len的长度,每个都有九个方案。长度和len一样的,至少有n[0]-1种方案n[0]n[0]n[0]...的这个方案暴力地跑一遍看看是不是小于等于n即可#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;in......
  • Exp8 Web综合-20201324
    目录1基础问题回答1.1什么是表单1.2浏览器可以解析运行什么语言1.3WebServer支持哪些动态语言1.4防范注入攻击的方法有哪些2实验过程2.1Web前端HTML2.2Web前端javascipt2.3Web后端MySQL基础2.3.1建库2.3.2建表2.3.3修改密码2.3.4创建用户2.4Web后端PHP2.5最简单的S......
  • 20201226马瑞婕Exp-8 Web综合
    目录一、基础问题回答1.1.什么是表单1.2浏览器可以解析运行什么语言1.3WebServer支持哪些动态语言二、Web前端HTML2.1启动apache服务2.2新建html文件2.2.1编写一个简单的含有表单的HTML2.2.2测试三、Web前端javascipt3.1注册登录3.1.1登陆界面3.1.2登录成功界面3.2尝试......
  • 《AutoCAD2020中文版基础教程》和《从零开始—AutoCAD 2020中文版基础教程》配套资源
    《AutoCAD2020中文版基础教程》作者:姜春峰//武小紅//魏春雪中国青年出版社配套资源链接:https://pan.baidu.com/s/1kPGNKZEw2kOTGqZyXjpG7A?pwd=ux06提取码:ux06 《从零开始—AutoCAD2020中文版基础教程》配套资源链接:https://pan.baidu.com/s/1GRA57IbIVyeM17qMkkzugw提取码:q......
  • 2020年下半年--学习量化监测保证进展
    感觉好久没用博客了,还是需要一个这样的记录,来量化学习情况,进行监测,保证进展以下链接为我学习的脑图,可以说是我学习笔记的精华了,内容很多,大家可以自行打开,展开看链接:http://note.youdao.com/noteshare?id=cc2a896077547b8ee77853a7801508fd&sub=738D6A43ABAF44D187A74BE274B67F63QA......
  • Luogu P1903 [国家集训队] 数颜色 / 维护队列
    题目来源https://www.luogu.com.cn/problem/P1903[国家集训队]数颜色/维护队列题目描述墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会向你发布如下指令:\(Q\L\R\)代表询问你从第\(L\)支画笔到第\(R\)支画笔中共有几种......
  • P1790 小胡同学的连通图
    #include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<vector>usingnamespacestd;intpar[105]={0};intrank0[105]={0};introot[105]={0};voidinit(intn){for(inti=1;i......
  • Exp8 Web安全 实验报告—20201229赵斌
    一、实践目标(1)Web前端HTML能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。(2)Web前端javascipt理解JavaScript的基本功能,理解DOM。在(1)的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入的用户名......