WA 10 pts 求调
查看原帖
WA 10 pts 求调
448873
Pig_py楼主2023/11/1 21:54
#include<bits/stdc++.h>
using namespace std;
int n,k;
long long a[100005],ans;
int del[2000005];
int siz_link,siz_heap;
struct HEAP{
	long long val;
	int to_link;
};
HEAP Heap[200005];
struct Link{
	long long val;
	int pre,nxt;
}link[2000005];
long long Top(){
	return Heap[1].val;
}
void up(int x){
	while(x>1){
		if(Heap[x/2].val>Heap[x].val){
			swap(Heap[x/2],Heap[x]);
			x/=2;
		}
		else break;
	}
}
void down(int x){
	int son=x*2;
	while(son<siz_heap){
		if(son<siz_heap&&Heap[son+1].val<Heap[son].val){
			swap(Heap[son+1],Heap[son]);
		}
		if(Heap[son].val<Heap[x].val){
			swap(Heap[son],Heap[x]);
			x=son;
			son=x*2;
		}
		else break;
	}
}
void Heap_insert(long long val,int to_link){
	siz_heap++;
	Heap[siz_heap]={val,to_link};
	up(siz_heap);
}
void link_insert(long long val){
	siz_link++;
	link[siz_link].pre=siz_link-1;
	link[siz_link-1].nxt=siz_link;
	link[siz_link].val=val;
}
void Heap_remove(int x){
	Heap[x]=Heap[siz_heap];
	siz_heap--;
	up(x),down(x);
}
void link_delete(int x){
	if(!x)return;
	del[x]=1;
	link[link[x].nxt].pre=link[x].pre;
	link[link[x].pre].nxt=link[x].nxt;
}
signed main(){
	//freopen("in.txt","r",stdin);
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	for(int i=1;i<n;i++){
		link_insert(a[i+1]-a[i]);
		Heap_insert(a[i+1]-a[i],siz_link);
	}
	link[0].nxt=1;
	int turn=0;
	while(k--){
		turn++;
		//printf("turn:%d\n",turn);
		int i_begin=1;
		if(del[1])i_begin=link[0].nxt;
/*		for(int i=i_begin;i;i=link[i].nxt){
			printf("%d ",link[i].val);
		}
		printf("\n");*/
		while(del[Heap[1].to_link])Heap_remove(1);
/*		printf("%d\n",Heap[1].to_link);
*/		ans+=Top();
		int p=Heap[1].to_link;
/*		link_insert(link[link[p].pre].val+link[link[p].nxt]
		.val-link[p].val);
		Heap_insert(link[link[p].pre].val+link[link[p].nxt]
		.val-link[p].val,siz_link);*/
		int pre,nxt;
		long long val=link[link[p].pre].val+link[link[p].nxt]
		.val-link[p].val;
		pre=link[link[p].pre].pre;
		nxt=link[link[p].nxt].nxt;
		link_delete(Heap[1].to_link);
		link_delete(link[Heap[1].to_link].pre);
		link_delete(link[Heap[1].to_link].nxt);
		/*int */i_begin=1;
		if(del[1])i_begin=link[0].nxt;
/*		for(int i=i_begin;i;i=link[i].nxt){
			printf("%d ",link[i].val);
		}
		printf("\n");*/
		siz_link++;
		//del[p]=0;
		link[siz_link].pre=pre;
		link[pre].nxt=siz_link;
		link[siz_link].nxt=nxt;
		link[nxt].pre=siz_link;
		link[siz_link].val=val;
		Heap_insert(val,siz_link);
	}
	printf("%lld",ans);
}
/*
1
3
4
6
12

2 1 2 6

3 6
*/
2023/11/1 21:54
加载中...