QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#607238 | #8939. Permutation | Kanate# | TL | 0ms | 0kb | C++14 | 1.3kb | 2024-10-03 14:25:31 | 2024-10-03 14:25:32 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
double A = 0.618;
int solve1(int l,int r);
int solve2(int l,int r);
int solve0(int l,int r);
int ask(int x,int y){
int ans;
cout << "? " << x << " " << y << endl;cout.flush();
cin >> ans;
return ans;
}
//
int solve0(int l,int r){
if(l==r){
return l;
}
int x = ask(l,r);
if(x==l) return solve1(l,r);
if(x==r) return solve2(l,r);
int len1 = x - l + 1;
int len2 = r - x + 1;
if(len1<=len2){
int y = ask(l,x);
if(y==x) return solve2(l,x);
else return solve1(x,r);
}else {
int y = ask(x,r);
if(y==x) return solve1(x,r);
return solve2(l,x);
}
}
// 左端
int solve1(int l,int r){
if(l==r) return l;
if(r-l==1) return l + 1;
int len = A * (r-l+1);
int x = ask(l,l+len-1);
if(x == l) return solve1(l,l+len-1);
else return solve0(l+len,r);
}
int solve2(int l,int r){
if(l==r) return l;
if(r-l==1) return l;
int len = A * (r-l+1);
int x = ask(r-len+1,r);
if(x == r) return solve2(r-len+1,r);
else return solve0(l,r-len);
}
int T;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> T;
while(T-->0){
int n ;
cin >> n;
int ans = solve0(1,n) ;
cout << "!" << " " << ans << endl;
cout.flush();
}
return 0;
}
详细
Test #1:
score: 0
Time Limit Exceeded
input:
3 5 3 2
output:
? 1 5 ? 1 3 ? 3 3