题目链接:https://codeforces.com/contest/1111/problem/C
题意是输入n,k,a,b,表示有一个长度为2^n的区间,然后输入k个数,表示有k个超级英雄,然后输入k个超级英雄所在的位置,灭霸有两种操作,一种是删掉一个区间,如果这个区间里没有超级英雄代价就是a,如果有超级英雄代价就是这个区间长度*超级英雄个数*b,另一种操作就是将这个区间等分为[l, mid]和[mid + 1, r],问灭霸消灭所有超级英雄的最小代价是多少。
大致思路就是按题意去模拟,用分治的思想来实现区间的等分,从而更新最小值,问题是如何判断区间内有多少个超级英雄,这里可以用二分去查找,查找区间内超级英雄的个数就是upper_bound(pre, pre + m, r) - lower_bound(pre, pre + m, l),这个长度就是区间内超级英雄的个数。
AC代码:
#include <bits/stdc++.h>
#define ll long long
#define maxn 100005
using namespace std;
int n, m, a, b;
int pre[maxn];
ll dfs(int l,int r){
int xx = upper_bound(pre, pre + m, r) - lower_bound(pre, pre + m, l);
if(xx == 0) return a;
ll ans = (r - l + 1LL) * xx * b;
int mid = (l + r) >> 1;
if(l != r)
ans = min(ans, dfs(l, mid) + dfs(mid + 1, r));
return ans;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&a,&b);
for(int i=0;i<m;i++){
scanf("%d", &pre[i]);
}
sort(pre, pre + m);
ll ans = dfs(1, 1 << n);
printf("%lld\n", ans);
return 0;
}