[Codeforces 1589D] Guess the Permutation | 交互 思维 二分

简介: 题意多组输入:{每组给出一个n,有一个长度为n的数列,在开始的时候a i = i ,有三个数i , j , k 数列反转了 [i,j−1] [j,k]要求出这三个数,可以对系统进行询问 [ l , r ] 区间内 逆序对 的个数,会返回这个值}

题目链接


题意


多组输入:{

每组给出一个n,有一个长度为n的数列,在开始的时候a i = i ,有三个数i , j , k

数列反转了 [i,j−1] [j,k]

要求出这三个数,可以对系统进行询问 [ l , r ] 区间内 逆序对 的个数,会返回这个值

}


思路:


对于这个反转之后的数列来说,[ 1 , i ] 之内的逆序对的个数为0

所以在左端点固定(= 1)的情况下,二分右端点找到这个i ii

然后对于一段反转之后的数列:

5     4     3     2     1

逆序对数量:

0     1     2     3     4

假如去掉前面的5

那么就为

     0     1     2     3

两个做差发现值为4,+1就可以得到逆转的长度为5

所以说:


j = ask(i,n) - ask(i+1,n) + 1 + i;
k = j + ask(j,n) - ask(j+1,n);


而在二分左端点l ll的过程也不会很大,问题解决


ac_code:


ll ask(ll l,ll r){
  ll sysin = 0;
  cout <<"? " << l << ' ' << r << endl;
  cout.flush();
  cin >> sysin;
  return sysin;
}
int main() {
  int _ = read;
  while(_ --){
    ll n = read;
    ll l = 1,r = n;
    ll i,j,k;
    i = j = k = 0;
    while(l < r) {
      ll mid = l+r >> 1;
      if(ask(1,mid)) r = mid;
      else l = mid + 1;
    }
    i = l - 1;
    j = ask(i,n) - ask(i+1,n) + 1 + i;
    k = j + ask(j,n) - ask(j+1,n);
    cout << "! " << i << ' ' << j << ' ' << k << endl;
    cout.flush();
    // printf("! %lld %lld %lld\n",i,j,k);
  }
  return 0;
}




目录
相关文章
|
8月前
|
算法
The kth great number(小根堆思想,模板题)
The kth great number(小根堆思想,模板题)
26 0
The kth great number(小根堆思想,模板题)
|
10月前
|
文件存储
Easy Number Challenge(埃式筛思想+优雅暴力)
Easy Number Challenge(埃式筛思想+优雅暴力)
59 0
|
网络架构
Codeforces Round #755 D. Guess the Permutation(交互 二分)
Codeforces Round #755 D. Guess the Permutation(交互 二分)
70 0
codeforces319——B. Psychos in a Line(思维+单调栈)
codeforces319——B. Psychos in a Line(思维+单调栈)
75 0
codeforces319——B. Psychos in a Line(思维+单调栈)
AtCoder Beginner Contest 223 D - Restricted Permutation(建图 思维 构造 拓扑排序)
AtCoder Beginner Contest 223 D - Restricted Permutation(建图 思维 构造 拓扑排序)
88 0
Codeforces1153——D. Serval and Rooted Tree(思维好题+dfs+贪心)
Codeforces1153——D. Serval and Rooted Tree(思维好题+dfs+贪心)
98 0
Codeforces1153——D. Serval and Rooted Tree(思维好题+dfs+贪心)
Codeforces 796D. Police Stations (思维+bfs)
Codeforces 796D. Police Stations (思维+bfs)
79 0
|
人工智能
Codeforces1491——C.Pekora and Trampoline(差分思维+树状数组)
Codeforces1491——C.Pekora and Trampoline(差分思维+树状数组)
86 0
Codeforces1491——C.Pekora and Trampoline(差分思维+树状数组)
|
Java Shell
Codeforces Round #746 (Div. 2) D - Hemose in ICPC ?(交互 二分 欧拉序)
Codeforces Round #746 (Div. 2) D - Hemose in ICPC ?(交互 二分 欧拉序)
135 0