日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CF1370F2-The Hidden Pair(Hard Version)【交互题,二分】

發布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF1370F2-The Hidden Pair(Hard Version)【交互题,二分】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/CF1370F2


題目大意

TTT組數據,給出nnn個點的一棵樹,有兩個隱藏的關鍵點。你每次可以詢問一個點集,交互庫會回答這個點集中的一個點滿足它到兩個關鍵點的距離和最小,和這個距離。

要求在111111次詢問內求出這兩個關鍵點。

1≤T≤10,1≤n≤10001\leq T\leq 10,1\leq n\leq 10001T10,1n1000


解題思路

首先第一下不知道干啥就問整張圖吧。

這樣我們就得到了一個點rtrtrt和距離LLL。這個點rtrtrt一定在關鍵點u,vu,vu,v的路徑上,且LLL表示u,vu,vu,v之間的距離。

然后就好搞了,我們以rtrtrt為根,考慮利用這個LLL來搞點操作,我們每次選擇一個深度depdepdep然后詢問所有這個深度的點的話,如果得到的距離等于LLL就表示這個深度有u~vu\sim vuv路徑上的點。

也就是我們可以通過二分得到最深的位置,而最深的位置一定是離rtrtrt較遠的一個關鍵點uuu

而我們又知道兩個關鍵點的距離,以uuu為根詢問一遍深度LLL的節點就可以得到vvv了。

二分上界是min{L,depmax}min\{L,dep_{max}\}min{L,depmax?},所以次數是log(n)+2≤12log(n)+2\leq 12log(n)+212。好像多了一次?

再挖掘一下性質,發現我們找的是離rtrtrt較遠的一個關鍵點,所以這段距離一定是不小于?L?12?\lfloor\frac{L-1}{2}\rfloor?2L?1??的,這樣就可以少去一次了


code

#include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int N=1100; struct node{int to,next; }a[N<<1]; int T,n,tot,ls[N],mx; vector<int> v[N];char s[10]; void print(int x) {if(x>9)print(x/10);putchar(48+x%10);return;} void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return; } void dfs(int x,int fa,int dep){v[dep].push_back(x);mx=max(mx,dep);for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa)continue;dfs(y,x,dep+1);}return; } int main() {scanf("%d",&T);while(T--){memset(ls,0,sizeof(ls));tot=mx=0;for(int i=0;i<=n;i++)v[i].clear();scanf("%d",&n);for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);addl(y,x);}printf("? %d ",n);for(int i=1;i<=n;i++)print(i),putchar(' ');putchar('\n');fflush(stdout);int rt,L,u,uu;scanf("%d%d",&rt,&L);dfs(rt,0,0);u=uu=rt;int l=(L-1)/2+1,r=min(L,mx);while(l<=r){int mid=(l+r)>>1;printf("? %d ",v[mid].size());for(int i=0;i<v[mid].size();i++)print(v[mid][i]),putchar(' ');putchar('\n');fflush(stdout);int x,d;scanf("%d%d",&x,&d);if(d==L)l=mid+1,u=x;else r=mid-1;}v[L].clear();dfs(u,0,0);printf("? %d ",v[L].size());for(int i=0;i<v[L].size();i++)print(v[L][i]),putchar(' ');putchar('\n');fflush(stdout);scanf("%d%d",&uu,&L);printf("! %d %d\n",u,uu);fflush(stdout);scanf("%s",s+1);} } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的CF1370F2-The Hidden Pair(Hard Version)【交互题,二分】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。