QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#881978#9734. Identify ChordlichenghanTL 0ms0kbC++172.5kb2025-02-04 20:17:582025-02-04 20:17:59

Judging History

This is the latest submission verdict.

  • [2025-02-04 20:17:59]
  • Judged
  • Verdict: TL
  • Time: 0ms
  • Memory: 0kb
  • [2025-02-04 20:17:58]
  • Submitted

answer

#include <bits/stdc++.h>
//#define SELF
using namespace std;
int n;
inline int dist(int x,int y){
	if(x>y) swap(x,y);
	return min(y-x,n-y+x);
}
#ifdef SELF
int hida,hidb;
int cntask;
int ask(int x,int y){
	++cntask;
	printf("? %d %d ",x,y);
	int ans=min({dist(x,y),dist(x,hida)+1+dist(hidb,y),dist(x,hidb)+1+dist(hida,y)});
	printf("= %d\n",ans);
	return ans;
}
void answer(int x,int y){
	printf("! %d %d = ",x,y);
	if(x==hida&&y==hidb||x==hidb&&y==hida){
		printf("CORRECT, cnt=%d\n\n",cntask);
	}else{
		puts("WRONG\n");
		exit(0);
	}
}
#else
int ask(int x,int y){
	++x; ++y;
	printf("? %d %d\n",x,y); fflush(stdout);
	int ans;
	scanf("%d",&ans);
	return ans;
}
void answer(int x,int y){
	++x; ++y;
	printf("! %d %d\n",x,y);
	int ans;
	scanf("%d",&ans);
	if(ans==-1) exit(0);
}
#endif

int qmid(int x){
	if(n&1){
		int y=(x+n/2)%n,z=(x+n-n/2)%n;
		return 2*min(ask(x,y),ask(x,z))+1;
	}else{
		return 2*ask(x,(x+n/2)%n);
	}
}

void solve(){
	scanf("%d",&n);
#ifdef SELF
	scanf("%d%d",&hida,&hidb);
	cntask=0;
#endif
	if(n<=10){
		for(int i=0;i<n;i++){
			for(int j=i+2;j<n;j++){
				if(i==0&&j==n-1) continue;
				if(ask(i,j)==1) {
					answer(i,j);
					return;
				}
			}
		}
	}
	int x=0,y=n/3,z=2*n/3;
	int dx=qmid(x),dy=qmid(y),dz=qmid(z);
	if(dx==dy&&dy==dz){
		int dans=(n-dx)/2+1;
		int dxy=ask(x,y),dyz=ask(y,z),dzx=ask(z,x);
		if(dyz==dist(y,z)-dans+1){
			x=y; y=z;
		}else if(dzx==dist(z,x)-dans+1){
			y=x; x=z;
		}else assert(dxy==dist(x,y)-dans+1);
		int l=dans,r=dist(y,x),mid,drit=-1;
		while(l<=r){
			mid=(l+r)>>1;
			int w=(x+mid)%n;
			if(ask(x,w)==dist(x,w)-dans+1){
				drit=mid;
				r=mid-1;
			}else{
				l=mid+1;
			}
		}
		assert(drit!=-1);
		x+=drit;
		answer(x,(x-dans+n)%n);
		return;
	}else{
		if(dy>dx) swap(x,y),swap(dx,dy);
		if(dz>dx) swap(x,z),swap(dx,dz);
		int dxm=(n-dx)/4+1;
		int u=-1,v;
		for(int i:{dxm,n-dxm,dxm-1,dxm+1,n-dxm-1,n-dxm+1}){
			if(qmid((x+i)%n)==n){
				u=(x+i)%n; break;
			}
		}
		assert(u!=-1);
		v=u;
		while(qmid((u+n-1)%n)==n) u--;
		while(qmid((v+1)%n)==n) v++;
		assert(v==(u+1)%n||v==u);
		int p=u+n/4;
		int dans=0;
		for(int i=p-2;i<=p+2;i++) dans=max(dans,(n-qmid(i))/2);
		int dma=(dans+1)/2;
		for(int d:{dma,n/2-dma,dma-1,dma+1,n/2-dma-1,n/2-dma+1}){
			int uu=(u-d+n)%n,vv=(v+d)%n;
			if(dist(uu,vv)!=1&&ask(uu,vv)==1) {
				answer(uu,vv);
				return;
			}
		}
		assert(false);
	}
	
}

int main(){
	int tc;
	scanf("%d",&tc);
	while(tc--){
		solve();
	}
}
/*
2
1000000000 160000000 170000000
*/

詳細信息

Test #1:

score: 0
Time Limit Exceeded

input:

2
6
2
2
2
1

output:

? 1 3
? 1 4
? 1 5
? 2 4

result: