Code For 1 CodeForces - 768B (简单分治)

题目链接

类似于线段树, 但分治时要处理出区间长度

#include <iostream>
using namespace std;
typedef long long ll;
ll ql, qr, x;

ll len(ll x) {
    return x<=1?x:len(x/2)*2+1;
}

ll dfs(ll l, ll r, ll v) {
    if (l==r) return v;
    ll mid = l+len(v/2), ans = 0;
    if (mid>ql) ans += dfs(l,mid-1,v/2);
    if (mid<qr) ans += dfs(mid+1,r,v/2);
    if (ql<=mid&&mid<=qr) ans += v&1;
    return ans;
}

int main() {
    cin>>x>>ql>>qr;
    cout<<dfs(1,len(x),x)<<endl;
}

猜你喜欢

转载自www.cnblogs.com/uid001/p/10225652.html
今日推荐