QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#883358 | #9734. Identify Chord | zhulexuan | TL | 0ms | 3712kb | C++14 | 3.2kb | 2025-02-05 16:01:26 | 2025-02-05 16:01:26 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf INT_MAX
#define FF fflush(stdout)
#define fr(i,l,r) for (i=(l); i<=(r); i++)
#define rfr(i,l,r) for (i=(l); i>=(r); i--)
template<typename T>inline void read(T &n){
T w=1; n=0; char ch=getchar();
while (!isdigit(ch) && ch!=EOF){ if (ch=='-') w=-1; ch=getchar(); }
while (isdigit(ch) && ch!=EOF){ n=(n<<3)+(n<<1)+(ch&15); ch=getchar(); }
n*=w;
}
template<typename T>inline void write(T x){
if (x==0){ putchar('0'); return ; }
T tmp;
if (x>0) tmp=x;
else tmp=-x;
if (x<0) putchar('-');
char F[105];
long long cnt=0;
while (tmp){
F[++cnt]=tmp%10+48;
tmp/=10;
}
while (cnt) putchar(F[cnt--]);
}
#define Min(x,y) x = min(x,y)
#define Max(x,y) x = max(x,y)
//基础配置=================================================================================
ll n, ans;
struct grader{
ll n,x,y;
ll N(){ return n; }
ll dis(ll x,ll y){ return min(abs(x-y),n-abs(x-y)); }
void init(){ read(n), read(x), read(y); }
ll qry(ll l,ll r){
ll ans = dis(l,r);
Min( ans , dis(l,x) + 1 + dis(y,r) );
Min( ans , dis(l,y) + 1 + dis(x,r) );
printf("qry %lld %lld = %lld\n",l,r,ans);
return ans;
}
void answer(ll l,ll r){
if (l==x && r==y){ printf("OK : %lld %lld\n",x,y); return ; }
if (l==y && r==x){ printf("OK : %lld %lld\n",x,y); return ; }
printf("Wrong : get %lld %lld , expected %lld %lld\n",l,r,x,y); exit(0);
}
}gr;
ll qry(ll x,ll y){
while (x>n) x -= n;
while (y>n) y -= n;
while (x<1) x += n;
while (y<1) y += n;
printf("? %lld %lld\n",x,y), FF;
read(ans); return ans;
// return ans = gr.qry(x,y);
}
void print(ll x,ll y){
while (x>n) x -= n;
while (y>n) y -= n;
while (x<1) x += n;
while (y<1) y += n;
printf("! %lld %lld\n",x,y), FF;
read(ans); return ;
// gr.answer(x,y);
}
ll To(ll x,ll y){
while (x>y) y += n;
return y-x;
}
void work(){
// gr.init(); n = gr.N();
read(n);
ll x = 1, y = n/2 + 1;
while (qry(x,y)==n/2){
if (n&1){ if (qry(x,y+1)!=n/2){ y++, swap(x,y); break; } }
x++, y++;
}
// printf("%lld %lld %lld\n",x,y,ans);
x = (x-1)%n+1, y = (y-1)%n+1;
if (ans==1){ print(x,y); return ; }
ll k = ans;
if (To(x,y)==n/2){
if (qry(x+1,y)==k || qry(x,y-1)==k) swap(x,y);
}
if (qry(x+1,y)==k && qry(x,y-1)==k) swap(x,y);
ll l = x, r = y, mid, p = l; while (l>r) r += n;
// printf("l = %lld , r = %lld , k = %lld\n",l,r,k);
while (l<=r){
// printf("l = %lld , r = %lld\n",l,r);
mid = (l+r)>>1;
if (qry(mid,y)==k-To(x,mid)) l = mid+1, p = mid;
else r = mid-1;
}
ll p2 = y - (k-1-To(x,p));
if (qry(y,p2)!=1) p2 = 2*y-p2;
l = p, r = p2;
// l = p, r = y - (qry(l,y)-1);
print(l,r); return ;
}
int main(){
// freopen("a.in","r",stdin);
// freopen(".out","w",stdout);
ll qt; read(qt);
while (qt--) work();
return 0;
}
//g++ a.cpp -o a -Wall -Wl,--stack=512000000 -std=c++11 -O2
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3712kb
input:
2 6 2 1 2 2 2 1 1 0 1 4 1 1
output:
? 1 4 ? 2 4 ? 1 3 ? 5 1 ? 4 6 ? 2 4 ? 3 4 ? 4 4 ! 2 4 ? 1 3 ! 1 3
result:
ok ok (2 test cases)
Test #2:
score: -100
Time Limit Exceeded
input:
1000 15 5 4 6 4 2 2 1 0 1 19 5 4 6 4 5 4 3 4 2 1 17 5 4 6 4 4 4 3 4 2 1 15 6 6 7 4 7 6 5 -1
output:
? 1 8 ? 2 8 ? 1 7 ? 2 8 ? 4 8 ? 6 8 ? 5 8 ? 8 8 ! 5 8 ? 1 10 ? 2 10 ? 1 9 ? 2 10 ? 5 10 ? 2 10 ? 3 10 ? 4 10 ? 10 8 ! 3 12 ? 1 9 ? 2 9 ? 1 8 ? 2 9 ? 5 9 ? 2 9 ? 3 9 ? 4 9 ? 9 7 ! 3 11 ? 1 8 ? 2 8 ? 9 1 ? 12 1 ? 9 1 ? 8 1 ? 1 11 ! 8 6