QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#883358#9734. Identify ChordzhulexuanTL 0ms3712kbC++143.2kb2025-02-05 16:01:262025-02-05 16:01:26

Judging History

This is the latest submission verdict.

  • [2025-02-05 16:01:26]
  • Judged
  • Verdict: TL
  • Time: 0ms
  • Memory: 3712kb
  • [2025-02-05 16:01:26]
  • Submitted

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

詳細信息

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

result: