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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【交互】【随机】Lost Root(CF1061F)

發布時間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【交互】【随机】Lost Root(CF1061F) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

luogu
CF1061F


題目大意

給出n和k,現在有一顆n個點的滿k叉樹,每次查詢可以問一個點是否在另外兩個點的路徑上,讓你在 60×n60\times n60×n 次詢問內得到根節點


解題思路

因為是滿k叉數,可以先得到深度dep

每次隨機找兩個點,用 n 次查詢判斷這兩個點路徑之間的點數,如果為 dep×2?1dep\times 2-1dep×2?1 就是根節點兩個不同子樹中的葉子結點,那么根節點一定在該路徑上,然后暴力判斷那個點是根節點即可(到葉子結點路徑長度為dep)

因為葉子結點的數量大于 n2\frac{n}{2}2n?,所以隨機到兩個葉子結點的概率是 14\frac{1}{4}41?,隨機到不同子樹的概率為 k?1k\frac{k-1}{k}kk?1?,所以找到符合條件的兩個葉子結點的概率為 k?14k\frac{k-1}{4k}4kk?1?,當k=2時,概率最小,為18\frac{1}{8}81?

期望可以在規定次數內找到答案


code

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 1510 using namespace std; int n,k,x,y,dep,p[N][2],d[N][N]; char s[10]; int get(int x,int y,int g)//判斷路徑長度 {int sum=2;p[x][g]=p[y][g]=0;for(int i=1;i<=n;++i){if(i==x||i==y)continue;printf("? %d %d %d\n",x,i,y);fflush(stdout);scanf("%s",s);if(s[0]=='Y')sum++,p[i][g]=1;else p[i][g]=0;}return sum; } int main() {srand(2018729);scanf("%d%d",&n,&k);x=n;y=1;while(x){x-=y;y*=k;dep++;}while(1){x=rand()%n+1;y=rand()%n+1;while(x==y||d[x][y]){x=rand()%n+1;y=rand()%n+1;}d[x][y]=1;d[y][x]=1;if(get(x,y,1)==dep*2-1){//找到了for(int i=1;i<=n;++i)//暴力判斷那個點是根節點if(p[i][1]&&get(x,i,0)==dep){printf("! %d\n",i);return 0;}}}return 0; }

總結

以上是生活随笔為你收集整理的【交互】【随机】Lost Root(CF1061F)的全部內容,希望文章能夠幫你解決所遇到的問題。

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