栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

一道树上二分的题目(codeforces round #746(Div.2) D. Hemose in ICPC ?)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一道树上二分的题目(codeforces round #746(Div.2) D. Hemose in ICPC ?)

题目链接:https://codeforces.com/contest/1592/problem/D

一般交互题常见的思路 1是二分 2是分块

这道题可以先跑一遍欧拉序,将结点保存在a数组内,之后我们就可以二分a数内连续的一端(这个连续的一段就代表着树内连续的一条边) ,找出的l,r就是题目的答案。
代码如下:

#include 
using namespace std;
#define rep(x, y, z) for (int x = y; x <= z; x++)
#define dec(x, y, z) for (int x = y; x >= z; x--)
const int N = 10010, mod = 1e9 + 7;
const double expp = 1e-10;
typedef long long ll;
//------------------------
int n;
vector G[N];
vector ve;
int a[N];
int cnt;
void add(int a,int b){
	G[a].push_back(b);
}
void dfs(int u,int fa){
	for(auto v:G[u]){
		if(v == fa) continue;
		a[++cnt] = v;
		dfs(v,u);
		a[++cnt] = u;
	}
}
int query(){
	sort(ve.begin(),ve.end());
	ve.erase(unique(ve.begin(),ve.end()),ve.end());
	cout<<"? "<<(int)ve.size()<<" ";
	rep(i,0,(int)ve.size()-1) cout<>ans;
	return ans;
}
int main(){
	cin>>n;
	rep(i,1,n-1){
		int u,v;
		cin>>u>>v;
		add(u,v);
		add(v,u);
	}
	a[++cnt] = 1;
	dfs(1,0);
	rep(i,1,cnt) ve.push_back(a[i]);
	int maxx = query();
	
	int l=1,r = cnt;
	while(l+1> 1;
		ve.clear();
		rep(i,l,mid) ve.push_back(a[i]);
		if(query() < maxx ) l = mid;
		else r = mid; 
	}
	cout<<"! "<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/302375.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号