「杂题乱刷2」CF1370F2
1.「算法笔记」构造选讲2.「杂题乱刷」CF1221B3.「杂题乱刷」CF468A4.「杂题乱刷」AT_abc337_e5.「杂题乱刷」洛谷 P88666.「杂题乱刷」CF1937C & CF1936A7.「杂题乱刷」CF1934D28.「杂题乱刷」at_abc092_d & AT_arc093_b9.「杂题乱刷」CF74E10.「杂题乱刷」AT_abc096_d11.「杂题乱刷」CF1973D12.「杂题乱刷」CF1977B13.「杂题乱刷」P827914.「杂题乱刷」P1067815.「杂题乱刷2」CF1015D Walking Between Houses16.「杂题乱刷2」CF1889A Qingshan Loves Strings 217.「杂题乱刷2」CF1567D18.「杂题乱刷2」CF1493C19.「杂题乱刷2」CF862C20.「杂题乱刷2」CF1365G21.「杂题乱刷2」AT_arc184_a
22.「杂题乱刷2」CF1370F2
23.「杂题乱刷2」CF2040D24.「杂题乱刷2」CF1738F Connectivity Addicts25.「杂题乱刷2」CF109D题目链接
CF1370F2 The Hidden Pair (Hard Version) (*2700)
题目描述
真的很难吗?
我们首先考虑找出第一个特殊点。
我们可以先求出这两个点路径中的任意一个点。发现询问
接下来以这个路径中的一个点为根来确定每个节点的深度。
接下来考虑二分出两个特殊点的路径中最深的点,容易发现这个东西是有单调性的。
我们找到一个点后,我们发现这个点就是路径的边界,那么我们就可以以找到的这个特殊点为根来根据我们的第一次询问确定另一个特殊点的深度。
这样就能找到两个特殊点了。
询问次数为
我们继续考虑优化二分的边界。
假设这条路径为
那么我们就将二分次数减少了
此时总共询问
参考代码
#include<bits/stdc++.h>
using namespace std;
//#define map unordered_map
#define re register
#define ll long long
#define forl(i,a,b) for(re ll (i)=(a);i<=(b);(i)++)
#define forr(i,a,b) for(re ll (i)=(a);i>=(b);(i)--)
#define forll(i,a,b,c) for(re ll (i)=(a);i<=(b);(i)+=(c))
#define forrr(i,a,b,c) for(re ll (i)=(a);i>=(b);(i)-=(c))
#define forL(i,a,b,c) for(re ll (i)=(a);((i)<=(b)) && (c);(i)++)
#define forR(i,a,b,c) for(re ll (i)=(a);((i)>=(b)) && (c);(i)--)
#define forLL(i,a,b,c,d) for(re ll (i)=(a);((i)<=(b)) && (d);(i)+=(c))
#define forRR(i,a,b,c,d) for(re ll (i)=(a);((i)>=(b)) && (d);(i)-=(c))
#define pii pair<ll,ll>
#define mid ((l+r)>>1)
#define lowbit(x) (x&-x)
#define pb push_back
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
//#define endl '\n'
#define QwQ return 0;
#define db long double
#define ull unsigned long long
#define lcm(x,y) (1ll*(x)/__gcd(x,y)*(y))
#define Sum(x,y) (1ll*((x)+(y))*((y)-(x)+1)/2)
#define x first
#define y second
template<typename T1,typename T2>bool Max(T1&x,T2 y){if(y>x)return x=y,1;return 0;}
template<typename T1,typename T2>bool Min(T1&x,T2 y){if(y<x)return x=y,1;return 0;}
ll _t_;
void _clear(){}
ll n;
ll x,y;
ll dep[1010];
vector<ll>G[1010];
vector<ll>D[1010];
vector<ll>q;
string s;
ll L,R;
pii ans;
pii ask(vector<ll>a)
{
cout<<"? "<<a.size()<<' ';
for(auto i:a)
cout<<i<<' ';
cout<<endl;
ll x,y;
cin>>x>>y;
return {x,y};
}
void dfs(ll x,ll fa,ll deep)
{
Max(R,deep);
D[deep].pb(x);
for(auto i:G[x])
if(i!=fa)
dfs(i,x,deep+1);
}
void solve()
{
_clear();
cin>>n;
forl(i,1,n)
G[i].clear();
forl(i,2,n)
cin>>x>>y,
G[x].pb(y),
G[y].pb(x);
q.clear();
forl(i,1,n)
q.pb(i);
pii num=ask(q);
q.clear();
forl(i,1,n)
D[i].clear();
R=0;
dfs(num.x,0,1);
L=max(1ll,(num.y+1)/2);
Min(R,num.y+1);
while(L<R)
{
ll Mid=(L+R+1)/2;
pii now=ask(D[Mid]);
if(now.y==num.y)
ans.x=now.x,
L=Mid;
else
R=Mid-1;
}
forl(i,1,n)
D[i].clear();
dfs(ans.x,0,1);
pii num2=ask(D[num.y+1]);
ans.y=num2.x;
cout<<"! "<<ans.x<<' '<<ans.y<<endl;
cin>>s;
}
int main()
{
// freopen("tst.txt","r",stdin);
// freopen("sans.txt","w",stdout);
// IOS;
_t_=1;
cin>>_t_;
while(_t_--)
solve();
QwQ;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效