题意:n个数,每次任取两个数合并,合并两个数的代价即为两数和,直至只剩下一个数,即进行(n-1)次合并。求代价和最小
贪心,每次合并最小值和次小值(取两次当前最小值),并将合并所得的新数加入比较
利用堆动态维护最小值
#include<stdio.h>
int n;
int c[500010];
int lowbit(int x) {
return(x & -x);
}
void add(int x, int v) {
while (x <= n) {
c[x] += v;
x += lowbit(x);
}
}
int get_sum(int x){
int ans = 0;
while (x > 0) {
ans += c[x];
x -= lowbit(x);
}
return(ans);
}
int main(){
int m;
int i;
int t, x, y;
scanf("%d %d", &n, &m);
for (i = 1; i <= n; i++) {
scanf("%d", &x);
add(i, x);
}
for (i = 1; i <= m; i++){
scanf("%d %d %d", &t, &x, &y);
if (t == 1) add(x, y); else printf("%d\n", get_sum(y) - get_sum(x - 1));
}
}
——Eirlys