QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#829521#8939. PermutationOIer2008TL 0ms3592kbC++142.2kb2024-12-24 10:37:262024-12-24 10:37:27

Judging History

This is the latest submission verdict.

  • [2024-12-24 10:37:27]
  • Judged
  • Verdict: TL
  • Time: 0ms
  • Memory: 3592kb
  • [2024-12-24 10:37:26]
  • Submitted

answer

#include<bits/stdc++.h>
#define fo(i,l,r) for(int i=l;i<=r;++i)
#define fu(i,l,r) for(int i=l;i<r;++i)
#define fd(i,r,l) for(int i=r;i>=l;--i)
#define ll long long
#define I inline int
#define V inline void
#define B inline bool
#define L inline ll
#define pi pair<int,int>
#define mk make_pair
#define fi first
#define se second
#define pb push_back
#define vi vector<int>
#define vii vector<pi>
#define popc __builtin_popcount
using namespace std;
const int N=1e6+10,mod=998244353;
char St;
I read() {
	int x=0,y=1;char c=getchar();
	while(c<48||c>57) {if(c==45)y=-y;c=getchar();}
	while(c>=48&&c<=57) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*y;
}
L ksm(ll x,int y) {ll t(1);for(;y;y>>=1,x=x*x%mod)if(y&1)t=t*x%mod;return t;}
int s1(0),s2(0);
I ask(int l,int r) {
	if(l==r) return 0;
	cout<<"? "<<l<<" "<<r<<endl;
	s1++;s2+=r-l+1;
	int x;
	cin>>x;return x;
}
I solve(int l,int r) {
	if(l==r) return l;
	int mid=l+r>>1,se=ask(l,r);
	if(se<=mid) {
		if(l==mid) return solve(mid+1,r);
		int se2=ask(l,mid);
		if(se==se2) {//[l,mid]
			r=mid;
			mid=l+r>>1;
			int se3;
			if(se2<=mid) {
				se3=ask(l,mid);
				if(se3==se2) return solve(l,mid);
				else return solve(mid+1,r);
			}
			else {
				se3=ask(mid+1,r);
				if(se3==se2) return solve(mid+1,r);
				else return solve(l,mid);
			}
		}
		else {
			l=mid+1;mid=l+r>>1;
			int se3=ask(se,mid);
			if(se3==se) return solve(l,mid);
			else return solve(mid+1,r);
		}
	}
	else {
		if(mid+1==r) return solve(l,mid);
		int se2=ask(mid+1,r);
		if(se==se2) {
			l=mid+1;
			mid=l+r>>1;
			int se3;
			if(se2<=mid) {
				se3=ask(l,mid);
				if(se3==se2) return solve(l,mid);
				else return solve(mid+1,r);
			}
			else {
				se3=ask(mid+1,r);
				if(se3==se2) return solve(mid+1,r);
				else return solve(l,mid);
			}
		}
		else {
			r=mid;mid=l+r>>1;
			int se3=ask(mid+1,se);
			if(se3==se) return solve(mid+1,r);
			else return solve(l,mid);
		}
	}
}
int n;
V solve() {
	s1=s2=0;
	cin>>n;
	int t=solve(1,n);
	cout<<"! "<<t<<endl;
}
char Ed;
int main() {
//	cerr<<"memory:"<<(&St-&Ed)/1024.0<<endl;
	int T;cin>>T;
	while(T--) solve();
//	cerr<<"time:"<<clock()<<endl;
	return 0;
}


详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 3592kb

input:

3
5
3
2
3
6
6
5
3
1
4
3
3

output:

? 1 5
? 1 3
? 3 4
! 4
? 1 6
? 4 6
? 3 6
? 1 2
! 2
? 1 4
? 3 4
! 4

result:

ok Correct (3 test cases)

Test #2:

score: -100
Time Limit Exceeded

input:

10000
10
2
2
3
5
10
10
10
9
7
7
10
5
1
5
6
6
10
4
4
5
2
1

output:

? 1 10
? 1 5
? 1 3
? 4 5
! 4
? 1 10
? 6 10
? 9 10
? 6 8
? 6 7
! 6
? 1 10
? 1 5
? 5 8
? 6 8
? 6 7
! 7
? 1 10
? 1 5
? 4 5
? 1 3
? 1 2
? 2 3

result: