Codeforces 768B 暴力 DFS

版权声明:欢迎转载,不要求署名~~~ https://blog.csdn.net/shadandeajian/article/details/82147523

传送门:题目

题意:

给一个根节点n,每次往下分3个结点,左中右分别是 n / 2 , n % 2 , n / 2 ,分到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;
}

猜你喜欢

转载自blog.csdn.net/shadandeajian/article/details/82147523