关于多测清空
查看原帖
关于多测清空
292300
Kobe303楼主2022/1/18 13:40
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define reg register 
#define il inline
const int N = 100005;
struct node {
	int val, l, r;
} p[N];
struct H {
	int val, id;
	bool operator<(const H&a) const {
		return a.val < val;
	}
	H (int x, int y) {
		val = x, id = y;
	}
};
int T;
int n, k, ans, last;
bool vis[N];
priority_queue<H> q;

void del(int x) {
	p[p[x].l].r = p[x].r;
	p[p[x].r].l = p[x].l;
}

int main() {
	scanf("%d", &T);
    while (T--) {
        memset(vis, 0, sizeof(vis));
        //qwq
        memset(p, 0, sizeof(p));
        //qwq
        ans = 0;
        while (!q.empty()) q.pop();
    	scanf("%d%d%d", &n, &k, &last);
    	for (int i = 1; i < n; ++i) {
    		int w; scanf("%d", &w);
    		p[i].l = i - 1, p[i].r = i + 1, p[i].val = w - last;
    		last = w;
    		q.push((H){p[i].val, i});
    	}
    	p[0].val = p[n].val = 0x3f3f3f3f;
    	for (int i = 1; i <= k; ++i) {
    		while (vis[q.top().id]) q.pop();
    		H u = q.top(); q.pop();
    		ans += u.val;
    		vis[p[u.id].l] = vis[p[u.id].r] = 1;
    		p[u.id].val = p[p[u.id].l].val + p[p[u.id].r].val - p[u.id].val;
    		q.push((H){p[u.id].val, u.id});
    		del(p[u.id].l), del(p[u.id].r);
    	}
    	printf("%d\n", ans);
    }
	return 0;
}
2022/1/18 13:40
加载中...