北京化工大学2018年10月程序设计竞赛 F. 罗dalao的密码(递归)

xiaoxiao2025-10-04  5

 

题目链接: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; }

 

转载请注明原文地址: https://www.6miu.com/read-5037322.html

最新回复(0)