QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#387898#4884. Battleship: New RulesunputdownableTL 1ms3692kbC++142.6kb2024-04-12 23:38:132024-04-12 23:38:14

Judging History

你现在查看的是最新测评结果

  • [2024-04-12 23:38:14]
  • 评测
  • 测评结果:TL
  • 用时:1ms
  • 内存:3692kb
  • [2024-04-12 23:38:13]
  • 提交

answer


#include <bits/stdc++.h>
// #define int long long
#define i64 long long
#define pii pair <int, int> 
using namespace std;
int n,Ax,Ay,Bx,By;
inline void Answer(int x,int y) {
    cout<<"! "<<x<<' '<<y<<endl;
    int res; cin>>res;
    if(res==-1) exit(0);
}
inline int qry(int x,int y) {
    cout<<"? "<<x<<' '<<y<<endl;
    int res; cin>>res;
    if(res==-1) exit(0);
    return res;
}
#define lch (x<<1)
#define rch (x<<1|1)
inline void chkmin(int&x,int y) { x=min(x,y); }
inline void chkmax(int&x,int y) { x=max(x,y); }
struct segtree {
    int lzy[2003];
    void init(int n,int v) { for(int i=0; i<2003; ++i) lzy[i]=v; }
    void upd(int x,int l,int r,const int ql,const int qr,const int v,const auto f) {
        if(ql<=l&&r<=qr) return f(lzy[x],v),void();
        int mid=(l+r)>>1;
        if(ql<=mid) upd(lch,l,mid,ql,qr,v,f);
        if(qr> mid) upd(rch,mid+1,r,ql,qr,v,f); 
    }
    int qry(int x,int l,int r,const int q,const auto f) {
        if(l==r) return lzy[x];
        int mid=(l+r)>>1;
        if(q<=mid) return f(lzy[x],qry(lch,l,mid,q,f));
        else return f(lzy[x],qry(rch,mid+1,r,q,f));
    }
} L,R;
mt19937 rnd(198341280);
int rev[2003];
pii pos[250005];
inline void dfs(int x,int l,int r) {
    int mid=(l+r)>>1; rev[x]=mid;
    if(l<mid) dfs(lch,l,mid-1);
    if(r>mid) dfs(rch,mid+1,r);
}
inline void work() {
    cin>>n;
    if(n&1) return Answer(-1,-1),void();
    n=n/2-1;
    int cnt=0;
    auto Max=[&](int x,int y){return x>y ? x : y;};
    auto Min=[&](int x,int y){return x<y ? x : y;};
    dfs(1,1,n);
    int ccc=0;
    for(int i=1; i<=4*n; ++i) if(rev[i]) rev[++ccc]=rev[i];
    for(int i=1; i<=n; ++i) {
        pos[++cnt]=make_pair(rev[i],rev[i]);
        for(int u=1; u<i; ++u) {
        pos[++cnt]=make_pair(rev[i],rev[u]);
        pos[++cnt]=make_pair(rev[u],rev[i]);
        }
    } 
    assert(cnt==n*n);
    L.init(n,0);
    R.init(n,n+1);
    for(int i=1; i<=cnt; ++i) {
        int A,B,C,D,x=pos[i].first,y=pos[i].second;
        if(L.qry(1,1,n,x,Max)>=y&&y>=R.qry(1,1,n,x,Min)) continue;  
        A=qry(x*2,y*2),B=qry(x*2,y*2+1);
        C=qry(x*2+1,y*2),D=qry(x*2+1,y*2+1);
        if(A==0&&B==0&&C==0&&D==0) {
            return Answer(x<<1,y<<1),void();
        }
        if(A) R.upd(1,1,n,x,n,y,chkmin);
        if(B) L.upd(1,1,n,x,n,y,chkmax);
        if(C) R.upd(1,1,n,1,x,y,chkmin);
        if(D) L.upd(1,1,n,1,x,y,chkmax);
    }
}
signed main() {
    // freopen("localinput","r",stdin);
    // freopen("localoutput","w",stdout);
    int T; cin>>T;
    while(T--) work();
    // fprintf(stderr,"%.4lf\n",1.0*clock()/CLOCKS_PER_SEC);
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3692kb

input:

2
3
1
4
0
0
0
0
1

output:

! -1 -1
? 2 2
? 2 3
? 3 2
? 3 3
! 2 2

result:

ok max_C=1.00, avg_C=0.50 (2 test cases)

Test #2:

score: 0
Accepted
time: 0ms
memory: 3676kb

input:

100
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
0
1
4
0
0
0
...

output:

? 2 2
? 2 3
? 3 2
? 3 3
! 2 2
? 2 2
? 2 3
? 3 2
? 3 3
! 2 2
? 2 2
? 2 3
? 3 2
? 3 3
! 2 2
? 2 2
? 2 3
? 3 2
? 3 3
! 2 2
? 2 2
? 2 3
? 3 2
? 3 3
! 2 2
? 2 2
? 2 3
? 3 2
? 3 3
! 2 2
? 2 2
? 2 3
? 3 2
? 3 3
! 2 2
? 2 2
? 2 3
? 3 2
? 3 3
! 2 2
? 2 2
? 2 3
? 3 2
? 3 3
! 2 2
? 2 2
? 2 3
? 3 2
? 3 3
! 2 2
...

result:

ok max_C=1.00, avg_C=1.00 (100 test cases)

Test #3:

score: -100
Time Limit Exceeded

input:

100
10
0
0
1
0
0
0
0
1
0
0
1
0
0
0
0
0
1
10
0
0
1
1
0
0
0
1
0
0
0
1
0
0
1
0
0
0
0
1
0
0
1
0
0
0
0
1
0
0
1
1
1
0
0
0
0
0
0
1
0
0
1
0
0
1
0
1
0
0
1
0
0
0
0
0
1
10
0
0
0
1
0
0
0
1
0
0
0
1
0
1
0
0
0
0
1
0
0
0
1
0
0
0
1
0
1
0
0
0
0
0
1
0
1
0
0
0
1
0
0
0
1
0
1
0
0
0
1
0
1
0
0
0
1
0
1
0

output:

? 4 4
? 4 5
? 5 4
? 5 5
? 2 2
? 2 3
? 3 2
? 3 3
? 2 4
? 2 5
? 3 4
? 3 5
? 4 2
? 4 3
? 5 2
? 5 3
! 4 2
? 4 4
? 4 5
? 5 4
? 5 5
? 2 2
? 2 3
? 3 2
? 3 3
? 4 2
? 4 3
? 5 2
? 5 3
? 6 6
? 6 7
? 7 6
? 7 7
? 6 4
? 6 5
? 7 4
? 7 5
? 4 6
? 4 7
? 5 6
? 5 7
? 6 2
? 6 3
? 7 2
? 7 3
? 2 6
? 2 7
? 3 6
? 3 7
? 8 8
...

result: