这个题的解法我是在河南听过的; 但是尴尬; 没好好听,所以忘了; 大致意思就是:
选k个数,要求选的任意两个数不能相邻;
大致是一种抵消的反悔方式;
假设我们当前选了a[i],那么如果我们下次选了a[i-1] and a[i+1], 那么他们的代价差是:a[i-1]+a[i+1]-a[i]; 所以我们把 a[i] = a[i-1]+a[i+1]-a[i]; then a[i-1] and a[i+1] delele , 这样如果我们反悔,想要选a[i]’s(both sides); 就等价于再选一次a[i]; 所以放回a[i]; 用堆维护; 然后要注意 delele 的方式;
主要部分
for(R II i=1;i<=n;i++)
{
Q.push((node) {i,a[i]});
l[i]=i-1; r[i]=i+1;
}
while (k--) {
while (!Q.empty() && had[Q.top().wei]) Q.pop();
if(Q.empty() || Q.top().x<0) break ;
R II wei=Q.top().wei;
R II x=Q.top().x;
Q.pop();
ans+=x;
a[wei]=a[l[wei]]+a[r[wei]]-a[wei];
had[l[wei]]=had[r[wei]]=1;
l[wei]=l[l[wei]]; r[wei]=r[r[wei]];
l[r[wei]]=wei; r[l[wei]]=wei;
// 记录两侧来实现删;
Q.push((node) {wei,a[wei]});
}