题解:CF1498E Two Houses
证明:对于两个点
反证法,假设
令
显然对于两个点
矛盾,故
然后就很好做了,从入度差从大往小遍历点对,查询入度大的是否能走到入度小的即可。
#include <bits/stdc++.h>
using namespace std;
int n,a[505];
pair<int,pair<int,int>> p[250005];char s[15];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);int m=0;
for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) p[++m]={abs(a[i]-a[j]),a[i]>=a[j]?make_pair(i,j):make_pair(j,i)};
sort(p+1,p+m+1,greater<pair<int,pair<int,int>>>());
for(int i=1;i<=m;i++){
printf("? %d %d\n",p[i].second.first,p[i].second.second);
fflush(stdout);
scanf("%s",s+1);
if(s[1]=='Y'){
printf("! %d %d\n",p[i].second.first,p[i].second.second);
return 0;
}
}
printf("! 0 0");
return 0;
}