걍 간선만 가지고 이분탐색했는데 틀리네 이거 왜 틀리는지 알려줄 수 있음? 쿼리 횟수 때문인가?
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pi;
int n,w;
pi edge[1005];
int query(int l,int r){
set<int>st;
for(int i=l; i<=r; i++){
st.insert(edge[i].first);
st.insert(edge[i].second);
}
cout<<"? "<<st.size()<<" ";
for(int x : st) cout<<x<<" ";
cout.flush();
int a; cin>>a;
return a;
}
int main(){
cin>>n;
for(int i=1; i<n; i++) cin>>edge[i].first>>edge[i].second;
int l = 1,r = n-1;
w = query(l,r);
while(l<r){
int m = (l+r)>>1;
if(query(l,m)==w) r = m;
else l = m+1;
}
cout<<"! "<<edge[r].first<<" "<<edge[r].second;
}
wrong answer The gcd of the path from 421 to 928 isn't the Maximum possible gcd of path
이분탐색을 개같이했거나 쿼리를 많이 날렸거나 둘 중 하난데 어떤건지 모르겠음
오일러 투어 테크닉 안쓴거같은데
걍 저 코드가 왜안되는지만 알고싶은거임 오일러 신경안쓰고 - dc App
ETT를 통해 인접한 인덱스의 edge는 서로 연결되어있는 상태로 만드는게 이분탐색의 전제조건인데 이 코드는 그러지 못함. 그래서 이분탐색을 해도 소용이 없지 마치 정렬안된 상태에서 이분탐색하는것처럼
이해가안되는게 원소자체가 간선이고 이 간선들 중 최댓값이랑 일치하는게 있는가? 를 쿼리로 묻는건데 일치하는 쪽으로 계속 이동해서 왜 답을 못찾는거임? 연결성이랑 관련이 없는거같은데 - dc App
정렬안된상태여도 절반 중에 최댓값이 있는가? 를 알수만 있으면 이분탐색 가능하잖음 - dc App
간선 하나하나에 대해서가 아니라 간선의 포인트들의 집합 중 최대값을 하는거니까 안되는거지 예를들어 쿼리로 1,2랑 3,4 간선이 들어가면 1,4나 2,3 같은 의도치 않는 간선도 세어지잖아 그걸 막아야함
아 범위안에 없는 간선이 세어질 수 있다는거네 그래서 오일러투어 쓰는구나 ㄱㅅㄱㅅ - dc App