版权声明:欢迎转载,不要求署名~~~ https://blog.csdn.net/shadandeajian/article/details/82147523
传送门:题目
题意:
给一个根节点n,每次往下分3个结点,左中右分别是 ,分到1或0的时候停止下分,然后区间求和。
题解:
我们按照题目要求dfs一遍就好了,就是一棵树,遇到0或1的时候return。
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define debug(x) cout<<#x<<" = "<<x<<endl;
#define INF 0x3f3f3f3f
#define int long long
using namespace std;
int dfs(int n, int L, int R , int l , int r) {
if (l>R or r<L){//不在给定区间
return 0;
}
if (n == 0 or n == 1)//不能再往下分了
return n;
int mid = (l + r) / 2;
return dfs(n / 2, L, R, l, mid - 1) + dfs(n % 2, L, R, mid, mid) + dfs(n / 2, L, R, mid + 1, r);
}
signed main(void) {
int n, l, r;
cin >> n >> l >> r;
int x = n, len = 1;
while (x > 1) {
len = len * 2 + 1;
x >>= 1;
}
cout << dfs(n, l, r, 1, len) << endl;
return 0;
}