P9323 [EGOI2022] Toy Design / 玩具设计 题解
题目实际上是要求图的连通块情况。
不妨设
于是有两种情况:
1.
2.
先考虑如何判断第一种情况。
设
而对于第二种情况,可以二分查找
设连通块个数为
但是这样可以被特定的数据卡掉。
优化:
显然,如果
因此如果
于是我们只要二分
询问次数
优化效果:构造
优化之后询问次数
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=210;
int rt[N],fa[N],cnt,las;
int a[N],top;
vector<pair<int,int> > ans;
int Connected(int a, int i, int j);
void DescribeDesign(std::vector<std::pair<int, int>> result);
void ToyDesign(int n,int max_ops){
fa[1]=1;rt[1]=0;a[top=1]=1;
for(int i=2;i<=n;++i){
rt[i]=Connected(rt[i-1],i-1,i);cnt++;
if(rt[i]!=rt[i-1]){
fa[i]=i;
a[++top]=i;
continue;
}
int l=1,r=top,res=0;
while(l<=r){
int mid=(l+r)>>1;
if(a[mid]==i-1) {r=mid-1;continue;}
cnt++;
if(Connected(rt[a[mid]],a[mid],i)==rt[a[mid]]) r=mid-1;
else l=mid+1,res=mid;
}
fa[i]=a[res+1];
}
for(int i=1;i<=n;++i) if(fa[i]!=i) ans.push_back(make_pair(fa[i],i));
DescribeDesign(ans);
return;
}