QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#884641 | #9734. Identify Chord | Zpair | WA | 7ms | 3712kb | C++17 | 1.1kb | 2025-02-06 09:43:57 | 2025-02-06 09:43:58 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
int n;
int ask(int u,int v){
assert(u>=0);
assert(u<n);
assert(v>=0);
assert(v<n);
printf("? %d %d\n",u+1,v+1);
fflush(stdout);
int d;scanf("%d",&d);
return d;
}
void ret(int u,int v){
assert(u>=0);
assert(u<n);
assert(v>=0);
assert(v<n);
printf("! %d %d\n",u+1,v+1);
fflush(stdout);
int d;scanf("%d",&d);
}
int dis(int u,int v){
int d=abs(u-v);
return min(d,n-d);
}
int get(int x){
return (x%n+n)%n;
}
void solve(){
cin>>n;
int u=0,v=(n+1)/2;
for(int i=1;ask(u,v)==n/2;++i){
if(n&1){
if(i&1)u=get(u+1);
else v=get(v+1);
}
else{
u=get(u+1);
v=get(v+1);
}
}
int d1=ask(get(u+1),v);
int d2=ask(get(u-1),v);
int opt=(d1<d2?1:-1);
int l=0,r=n/2,mid=(l+r)>>1,ans=0;
int d=dis(u,v)-ask(u,v);
while(l<=r){
int w=get(u+mid*opt);
if(dis(w,v)-ask(w,v)==d)
ans=mid,l=mid+1;
else r=mid-1;
mid=(l+r)>>1;
}
int w=get(u+ans*opt),nd=ask(w,v);
int z=get(v-(nd-1)*opt);
if(ask(w,z)==1)
ret(w,z);
else{
z=get(v+(nd-1)*opt);
ret(w,z);
}
}
int main(){
int T;cin>>T;
while(T--)solve();
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 3712kb
input:
2 6 2 1 2 2 1 1 1 1 1 4 1 1 1 1 1 1 1 1 1
output:
? 1 4 ? 2 4 ? 6 4 ? 1 4 ? 2 4 ? 3 4 ? 2 4 ? 2 4 ! 2 4 ? 1 3 ? 2 3 ? 4 3 ? 1 3 ? 4 3 ? 1 3 ? 1 3 ? 1 3 ! 1 3
result:
ok ok (2 test cases)
Test #2:
score: -100
Wrong Answer
time: 7ms
memory: 3712kb
input:
1000 15 6 5 6 6 3 5 6 6 3 -1
output:
? 1 9 ? 2 9 ? 15 9 ? 1 9 ? 4 9 ? 2 9 ? 1 9 ? 1 9 ? 1 4 ! 1 14
result:
wrong answer Wrong answer n=15, actual=5-8, guessed=1-14 (test case 1)