贪心的话就懒得说了,反正一堆题解,只是看大家都用的优先队列然后突然想起自己好像很久没有写treap了就写了个treap,查询的话树上二分就好啦。。。。。然后一个插入一个删除,结果一开始虚拟建立的null节点的Min值开小了,只有1e9然后就惨烈的Re了2发心塞
#include<cstdio>
#include<cstring>
#include<iostream>
#define LL long long
#define maxn 100020
#include<cstdlib>
#define inf 0x3f3f3f3f
using namespace std;
struct Tree{
Tree* ch[2];
int x,Min,size,r;
Tree(){};
Tree(int a);
void up(){
size=1,Min=x;
size+=ch[0]->size,Min=min(Min,ch[0]->Min);
size+=ch[1]->size,Min=min(Min,ch[1]->Min);
}
}*rt;
Tree* null;
Tree::Tree(int a){ch[0]=ch[1]=null;size=1,x=Min=a;r=rand();}
void rotate(Tree* &u,int d){
if(u==null)return;
Tree* v=u->ch[!d];u->ch[!d]=v->ch[d];v->ch[d]=u;
u->up();v->up();u=v;
}
void insert(Tree* &u,int k,int x){
if(u==null){u=new Tree(x);return;}
int size=1,d;size+=u->ch[0]->size;
if(k>size)insert(u->ch[d=1],k-size,x);
else insert(u->ch[d=0],k,x);
if(u->ch[d]->r > u->r)rotate(u,!d);
u->up();
}
void remove(Tree* &u,int k){
if(k>u->size||k<1||u==null)return;
int size=1;
size+=u->ch[0]->size;
if(k==size){
if(u->ch[0]==null)u=u->ch[1];
else if(u->ch[1]==null)u=u->ch[0];
else {
int d;
if(u->ch[0]->r > u->ch[1]->r)rotate(u,d=1);
else rotate(u,d=0);
remove(u->ch[d],u->ch[d]->ch[0]->size+1);
}
}else if(k>size)remove(u->ch[1],k-size);
else remove(u->ch[0],k);
if(u!=null)u->up();
}
int ans;
int find(Tree* u){
int Min=1e9+1;
Min=min(u->ch[1]->Min,u->ch[0]->Min);
if(u->Min < Min){
ans=u->x;
return u->ch[0]->size+1;
}
if(u->ch[0]->Min < u->ch[1]->Min)return find(u->ch[0]);
else return find(u->ch[1])+u->ch[0]->size+1;
}
int query(Tree* u,int k){
int size=u->ch[0]->size+1;
if(size==k)return u->x;
if(k>size)return query(u->ch[1],k-size);
else return query(u->ch[0],k);
}
int n,k;
int main(){
int x,y;null=new Tree();
null->ch[0]=null->ch[1]=null;
null->x=null->size=0,null->Min=inf,null->r=-inf;
rt=null;
scanf("%d%d",&n,&k);scanf("%d",&y);
for(int i=2;i<=n;i++,y=x){
scanf("%d",&x);
insert(rt,i-1,x-y);
}
int id;int Ans=0;int ne;
while(k--){
id=find(rt);
Ans+=ans;ne=0;
if(id==1)remove(rt,id+1),remove(rt,id);
else if(id==rt->size)remove(rt,id),remove(rt,id-1);
else{
ne=query(rt,id-1)+query(rt,id+1);
remove(rt,id+1),remove(rt,id),remove(rt,id-1);
insert(rt,id-1,ne-ans);
}
}
printf("%d",Ans);
return 0;
}