记录编号 146726 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队2011]种树 最终得分 100
用户昵称 Gravatarnew ioer 是否通过 通过
代码语言 C++ 运行时间 0.278 s
提交时间 2015-01-19 12:02:02 内存使用 5.44 MiB
显示代码纯文本
#include<cstdio>
char cha[2000000],*ptr=cha;
const int maxn=200010;
int pre[maxn],next[maxn],bet[maxn],heap[maxn];
bool c[maxn];
void in(int &x){
	bool fl=0;while(*ptr<40) ptr++;
	if(*ptr==45) fl=1,x=0;else x=*ptr-48;ptr++;
	while(*ptr>47) x=x*10+*ptr++-48;if(fl) x=-x;
}
void swap(int &x,int &y){
	x=x^y,y=x^y,x=x^y;
}
void push(int x){
	int now,next;
	heap[now=++heap[0]]=x;
	if(heap[0]==1) return;
	while(now>1){
		next=now>>1;
		if(bet[heap[next]]>=bet[x]) break;
		else swap(heap[next],heap[now]);
		now=next;
	}
}
int top(){
	int res=heap[1];
	heap[1]=heap[heap[0]--];
	int now=1,next;
	while(1){
		next=now<<1;
		if(next>heap[0]) break;
		if(next<heap[0]&&bet[heap[next+1]]>bet[heap[next]]) next++;
		if(bet[heap[next]]<=bet[heap[now]]) break;
		else swap(heap[next],heap[now]);
		now=next;
	}
	return res;
}
int main(){
	freopen("nt2011_tree.in","r",stdin);
	freopen("nt2011_tree.out","w",stdout);
	fread(ptr,1,2000000,stdin);
	int n,m,i,ans=0;
	in(n),in(m);
	if(m>(n>>1)){
		printf("Error!");
		return 0;
	}
	for(i=1;i<=n;i++) in(bet[i]),push(i),pre[i]=i-1,next[i]=i+1;
	pre[1]=n,next[n]=1;
	while(m--){
		int a=top();
		while(c[a]) a=top();
		int pe=pre[a],net=next[a],ppre=pre[pe],nnext=next[net];
		ans+=bet[a],bet[a]=bet[pe]+bet[net]-bet[a];
		next[ppre]=a,pre[nnext]=a,pre[a]=ppre,next[a]=nnext;
		push(a),c[pe]=c[net]=1;
	}
	printf("%d",ans);
}