QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#566763#8939. PermutationUNos_mariconesTL 0ms3740kbC++231.9kb2024-09-16 01:35:162024-09-16 01:35:17

Judging History

This is the latest submission verdict.

  • [2024-09-16 01:35:17]
  • Judged
  • Verdict: TL
  • Time: 0ms
  • Memory: 3740kb
  • [2024-09-16 01:35:16]
  • Submitted

answer

#include<bits/stdc++.h>
#define ff first
#define ss second
#define ll long long
#define pb push_back
using namespace std;

map<pair<int, int>, int > respuestas;

int rangos = 0, n;

int mitadDer(int l, int r){
  int sum = l + r;
  if(sum % 2 == 0){
    return sum / 2 + 1;
  }else return sum / 2 + 1;

}
int mitadIzq(int l, int r){
  int sum = l + r;
  if(sum % 2 == 0){
    return sum / 2 - 1;
  }else return sum / 2 ;

}

int ask(int l, int r){
  if(l >= r)return -1;
  rangos += r - l + 1;
  //assert(rangos <= 3* n);
  if(respuestas.count({l, r})){
    return respuestas[{l, r}];
  }
  cout << "? " << l << " " << r << endl;
  cout.flush();
  int answ;
  cin >> answ;
  respuestas[{l, r}] = answ;
  return answ;
}
void responder(int v){
  cout << "! " << v << endl;
  cout.flush();
}

int solv(int l, int r, int p);
int solv(int l, int r){
  if(l == r)return l;
  int p = ask(l, r);
  return solv(l, r, p);
}

int solv(int l, int r, int p){
  if(l == r)return l;
  if(p == l && r - l == 1)return r;
  if(p == r && r - l == 1)return l;
  int mita = mitadDer(l, r);

  int q1, q2;
  if(p <= mita){
    int s = ask(l, mita);
    if(s == p){
      return solv(l, mita, p);
    }
    q2 = mitadIzq(mita + 1, r);
    s = ask(p, q2);
    if(s == p){
      return solv(mita + 1, q2);
    }else{
      return solv(q2 + 1, r);
    }
  }else{

    int s = ask(mita + 1, r);
    if(s == p){
      return solv(mita + 1, r, p);
    }
    q1 = mitadDer(l, mita) ;
    s = ask(q1, p);
    if(s == p){
      return solv(q1, mita);
    }else{
      return solv(l, q1-1);
    }

  }
}





int main(){
  #ifdef LOCAL
  //freopen("in.txt", "r", stdin);
  #endif // LOCAL

  cin.tie(0);
  cout.tie(0);
  ios::sync_with_stdio(NULL);

  int t;
  cin >> t;
  while(t--){
      respuestas.clear();
    cin >> n;
    rangos = 0;
    responder(solv(1, n));

  }


}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

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

output:

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

result:

ok Correct (3 test cases)

Test #2:

score: -100
Time Limit Exceeded

input:

10000
10
2
2
2
3
3
10
10
7
10
5

output:

? 1 10
? 1 6
? 1 4
? 1 3
? 2 3
! 4
? 1 10
? 7 10
? 4 10
? 4 6

result: