题目链接:http://39.105.0.22/problem.php?cid=1022&pid=5
数据范围不大,直接对端点进行递归就好,根据p的值来判断在左区间还是右区间,然后把每次找到的端点存起来,然后我们倒着推就可以找到这个点在原来点的位置了,比如第一个样例,数组中存的是1 4,1 2,1 1,然后倒着向上推就可以推出来当前数字在原来顺序中的位置了,这点在纸上模拟一下就好了,不难想。
AC代码:
#include <bits/stdc++.h>
#define maxn 105
#define ll long long
using namespace std;
ll l[maxn],r[maxn];
ll n,m;
int T,num;
void dfs(ll L,ll R){
if(L == R) return ;
ll mid = (L + R - 1) >> 1;
if(m <= mid){
l[num] = L;
r[num++] = mid;
dfs(L, mid);
}
else{
l[num] = mid + 1;
r[num++] = R;
dfs(mid + 1, R);
}
}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%lld%lld",&n,&m);
num = 0;
l[num] = 1;
r[num++] = n;
dfs(1, n);
for(int i=num-1;i>=0;i--){
m = l[i] + r[i] - m;
}
printf("%lld\n",m);
}
return 0;
}