社区讨论

RE 求调,悬关

CF1990E1 Catch the Mole(Easy Version)参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@m4uoioke
此快照首次捕获于
2024/12/19 10:05
去年
此快照最后确认于
2025/11/04 12:39
4 个月前
查看原帖
思路:
随机化询问点,按照题意模拟。
代码:
CPP
#include<bits/stdc++.h>
using namespace std;
int t , n , akp , fa[5005];
vector<int> mp[5005] , rnd;
bool vis[5005] , visq[5005] , inq;
inline void add(int u , int v)
{
	mp[u].push_back(v);
	return;
}
inline void init()
{
	memset(vis , 1 , sizeof(vis));
	memset(visq , 0 , sizeof(visq));
	memset(fa , 0 , sizeof(fa));
	for(int i = 1 ; i <= n ; i++)
	{
		mp[i].clear();
	}
	return;
}
inline void findfa(int p , int f)
{
	fa[p] = f;
	for(int i = 0 ; i < mp[p].size() ; i++)
	{
		if(mp[p][i] == f)
		{
			continue;
		}
		findfa(mp[p][i] , p);
	}
	return;
}
inline void f0(int p , int f)
{
	vis[p] = 0;
	for(int i = 0 ; i < mp[p].size() ; i++)
	{
		if(mp[p][i] == f)
		{
			continue;
		}
		f0(mp[p][i] , p);
	}
	return;
}
inline void upd(int p , int f)
{
	bool flag = 0;
	for(int i = 0 ; i < mp[p].size() ; i++)
	{
		if(mp[p][i] == f)
		{
			continue;
		}
		flag |= vis[mp[p][i]];
	}
	if(p - 1)
	{
		vis[p] = flag;
	}
	for(int i = 0 ; i < mp[p].size() ; i++)
	{
		if(mp[p][i] == f)
		{
			continue;
		}
		upd(mp[p][i] , p);
	}
	return;
}
inline void sve(int p , int f)
{
	visq[p] = vis[p];
	for(int i = 0 ; i < mp[p].size() ; i++)
	{
		if(mp[p][i] == f)
		{
			continue;
		}
		sve(mp[p][i] , p);
	}
	return;
}
int main()
{
	auto now = std::chrono::system_clock::now();
	auto ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now);
	auto T = ms.time_since_epoch().count();
	cin >> t;
	srand(T * t + 1);
	while(t--)
	{
		cin >> n;
		init();
		for(int i = 1 ; i < n ; i++)
		{
			int u , v;
			cin >> u >> v;
			add(u , v);
			add(v , u);
		}
		findfa(1 , 0);
		for(int k = 1 ; k <= 300 ; k++)
		{
			rnd.clear();
			for(int i = 1 ; i <= n ; i++)
			{
				if(vis[i])
				{
					rnd.push_back(i);
				}
			}
			akp = rnd[rand() % rnd.size()];  CF 报错说这里出现了模 0 错误。-----------------------------
			if(rnd.size() == 1)
			{
				cout << "! " << akp << endl;
				break;
			}
			cout << "? " << akp << endl;
			cin >> inq;
			if(!inq)
			{
				f0(akp , fa[akp]);
				upd(1 , 0);
			}
			else
			{
				for(int i = 1 ; i <= n ; i++)
				{
					visq[i] = 0;
				}
				sve(akp , fa[akp]);
				for(int i = 1 ; i <= n ; i++)
				{
					vis[i] = visq[i];
				}
			}
		}
	}
	return 0;
}
玄关!!!
求各位大佬帮忙!

回复

4 条回复,欢迎继续交流。

正在加载回复...