种菜
题解如上:
自此。对于不相邻的问题,我们可以考虑用数组链表来解决[或者说相邻的问题]。用贡献的累积加减模拟对最佳元素的选择。
删除相邻元素来实现新的关系。
代码如下:
#include<bits/stdc++.h>
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define ll long long
using namespace std;
const int maxn = 200050;
struct node{
int val;
int index;
bool operator < (const node &rhs)const{
return val<rhs.val;
}
}A[maxn];
priority_queue<node>q;
int n,m;
int vis[maxn],val[maxn];
int lft[maxn],rgt[maxn];
int ans;
void del(int x){
rgt[lft[x]]=rgt[x];
lft[rgt[x]]=lft[x];
}
int main(){
cin>>n>>m;
FOR(i,1,n){
scanf("%d",&A[i].val);
A[i].index=i;
q.push(A[i]);
val[i]=A[i].val;
rgt[i]=i+1<=n?i+1:1;
lft[i]=i-1>=1?i-1:n;
}
if(n<2*m){
printf("Error!\n");
return 0;
}
FOR(i,1,m){
node u=q.top();
int mark=0;
while(!q.empty()&&vis[u.index]){
q.pop();
u=q.top();
}
q.pop();
ans+=u.val;
int r=rgt[u.index];
int l=lft[u.index];
del(r);
del(l);
vis[r]=vis[l]=1;
u.val=val[u.index]=val[l]+val[r]-u.val;
q.push(u);
}
cout<<ans<<endl;
}