【分治思想】12627 Erratic Expansion

分治处理问题,需要注意的是用一个数组d[i]记录第i次分裂过后红气球的总数(也就是3 ^ i)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
using namespace std;
typedef long long LL;
LL dp[50];  /*第i次分裂之后1到该行红气球的总数?*/
LL dfs_top(int k,int i){
    LL top = 1 << (k - 1);
    if(k == 0)
      return i >= 1;
    if((1 << k) == i)
      return dp[k];
    if(i <= top)
      return 2 * dfs_top(k - 1, i);

   return 2 * dp[k - 1] + dfs_top(k - 1, i - top);
}
int main(){
    int T;
    int Case = 1;
    for(int i = 0 ; i < 35 ; i++){
        double t =  pow(1.0 * 3,1.0 * i);
        dp[i] = (LL)t;
    }
    scanf("%d",&T);
    while(T--){
        int time,x,y;
        scanf("%d%d%d",&time,&x,&y);
        LL ans = dfs_top(time,y) - dfs_top(time,x - 1);
        printf("Case %d: %lld\n",Case++,ans);
    }
    return 0;
}


你可能感兴趣的:(【分治思想】12627 Erratic Expansion)