| 记录编号 | 
        296906 | 
        评测结果 | 
        AAAAAAAAAAAAAAAAAAAA | 
    
    
        | 题目名称 | 
        1862.[国家集训队2011]种树 | 
        最终得分 | 
        100 | 
            
    
    
        | 用户昵称 | 
         Sky_miner | 
        是否通过 | 
        通过 | 
    
    
        | 代码语言 | 
        C++ | 
        运行时间 | 
        1.574 s  | 
    
    
        | 提交时间 | 
        2016-08-16 09:04:48 | 
        内存使用 | 
        2.46 MiB  | 
        
    
    
    
    		显示代码纯文本
		
		#include <cstdio>
#include <set>
using namespace std;
const int maxn = 200010;
inline void read(int &x){
	x=0;char ch;bool flag = false;
	while(ch=getchar(),ch<'!');if( ch == '-' ) ch=getchar(),flag = true;
	while(x=10*x+ch-'0',ch=getchar(),ch>'!');if( flag ) x=-x;
}
int n,m,a[maxn];
struct Node{
	int val,num;
};
typedef set<Node> ll;
bool operator < (const Node &a,const Node &b){
	return a.val == b.val ? a.num > b.num : a.val > b.val;
}
void del(ll &s,int* a,int num){
	if( num == 0 ) return;
	ll::iterator tmp = s.find( (Node){a[num],num} );
	if( tmp != s.end() ) s.erase(tmp);
}
int pre[maxn],suc[maxn];
int main(){
	freopen("nt2011_tree.in","r",stdin);
	freopen("nt2011_tree.out","w",stdout);
	read(n);read(m);
	for(int i=1;i<=n;++i) read(a[i]);
	if( m > (n >> 1) ){
		printf("Error!\n");
		//getchar();getchar();
		return 0;
	}else{
		int ans = 0;
		for(int i=1;i<=n;++i) pre[i] = i-1,suc[i] = i+1;
		pre[1] = n;suc[n] = 1;
		ll s;s.clear();
		for(int i=1;i<=n;++i) s.insert((Node){a[i],i} );
		Node tmp;
		for(int i=1;i<=m;++i){
			tmp = *s.begin();
			s.erase(s.begin());
			ans += tmp.val;
			del(s,a,pre[tmp.num]);
			del(s,a,suc[tmp.num]);
			a[tmp.num] = a[pre[tmp.num]] + a[suc[tmp.num]] - a[tmp.num];
			pre[tmp.num] = pre[pre[tmp.num]];
			suc[tmp.num] = suc[suc[tmp.num]];
			pre[suc[tmp.num]] = suc[pre[tmp.num]] = tmp.num;
			s.insert((Node){a[tmp.num],tmp.num});
		}
		printf("%d",ans);
	}
	//getchar();getchar();
	return 0;
}