CodeForces - 1111C——分治

CodeForces - 1111C

题解:
直接分治,对应的区域求有多少个复仇者,如果没有直接返回,不然会超时。

#include 
using namespace std;
#define int long long
const int N=1e5+7;
int a[N],sum[N];
int n,k,A,B;
int solve(int l,int r)
{
    int cnt=upper_bound(a,a+k,r)-lower_bound(a,a+k,l);
    int res;
    if(!cnt){
        res=A;
        return res;
    }
    else{
        res=B*(r-l+1)*cnt;
    }
    if(l<r){
        int mid=l+r>>1;
        res=min(res,solve(l,mid)+solve(mid+1,r));
    }
    return res;
}
signed main()
{
    cin>>n>>k>>A>>B;
    for(int i=0;i<k;i++) scanf("%lld",&a[i]);
    sort(a,a+k);
    printf("%lld\n",solve(1,1<<n));
}

你可能感兴趣的:(二分)