社区讨论
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 条回复,欢迎继续交流。
正在加载回复...