rt.
本人的代码(51pts 从 #52 开始就一直 MLE):
//By AKNOI的梓钦 On 2022-06-21
#include<map>
#include<set>
#include<queue>
#include<deque>
#include<stack>
#include<ctime>
#include<cmath>
#include<cctype>
#include<bitset>
#include<vector>
#include<cstdio>
#include<climits>
#include<cstring>
#include<iostream>
#include<algorithm>
#define INF 0x3f3f3f3f
#define LLINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define N 1000005
using namespace std;
int read(){
int x=0,f=1,ch=getchar();
for(;!isdigit(ch);ch=getchar()) f=(ch=='-')?-1:1;
for(;isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
return x*f;
}
void print(ll x){
if(x<0) putchar('-'),x=~(x-1);
if(x>9) print(x/10);
putchar(x%10+48);
}
struct Seg{
ll sum;
int l,r,x,pre,rk;
}p[N*3];
int tot,hp[N*3],lg[N],f[21][N],bin[21],n,k;
ll a[N];
int _min(int x,int y){return a[x]<=a[y]?x:y;}
bool judge(int x,int y){
if(p[x].sum==p[y].sum){
if(p[x].x==p[y].x) return p[p[x].pre].rk<p[p[y].pre].rk;
return p[x].x<p[y].x;
}
return p[x].sum<p[y].sum;
}
void up(int x){
while(x){
if(x>>1 && judge(hp[x],hp[x>>1])) swap(hp[x],hp[x>>1]),x>>=1;
else break;
}
}
void down(int x){
register int s=x<<1;
while(s<=tot){
if(s<tot && judge(hp[s+1],hp[s])) ++s;
if(judge(hp[s],hp[x])) swap(hp[x],hp[s]),x=s,s<<=1;
else break;
}
}
int query(int l,int r){
register int h=lg[r-l+1];
return _min(f[h][l],f[h][r-bin[h]+1]);
}
void _print(int x){
print(p[x].x),putchar(' ');
if(p[x].pre) _print(p[x].pre);
}
void init(){
n=read(),k=read()-1;
if(!k){
puts("0");
exit(0);
}
a[0]=INF;
for(register int i=2;i<=n;++i) lg[i]=lg[i>>1]+1;
for(register int i=1;i<=n;++i){
a[i]=read();
f[0][i]=i;
}
bin[0]=1;
for(register int i=1;i<=20;++i) bin[i]=bin[i-1]<<1;
for(register int i=1;bin[i]<=n;++i){
for(register int j=1;j+bin[i-1]<=n;++j){
f[i][j]=_min(f[i-1][j],f[i-1][j+bin[i-1]]);
}
}
p[1].l=1,p[1].r=n;
p[1].x=query(1,n);
p[1].sum=a[p[1].x];
p[1].pre=0;
hp[++tot]=1;
}
void solve(){
register int tp=1;
register ll lst=-1,h=0;
while(k--){
register int g=hp[1];
swap(hp[1],hp[tot--]);
down(1);
Seg now=p[g];
if(!k){
print(now.sum);
puts("");
_print(g);
exit(0);
}
if(now.sum>lst){
lst=now.sum;
h=1;
}
else ++h;
p[g].rk=h;
if(now.x>1){
p[++tp].l=1,p[tp].r=now.x-1,p[tp].x=query(1,now.x-1);
p[tp].sum=now.sum+a[p[tp].x],p[tp].pre=g;
hp[++tot]=tp;
up(tot);
}
if(now.l<now.x){
p[++tp].l=now.l,p[tp].r=now.x-1,p[tp].x=query(now.l,now.x-1);
p[tp].sum=now.sum+a[p[tp].x]-a[now.x],p[tp].pre=now.pre;
hp[++tot]=tp;
up(tot);
}
if(now.x<now.r){
p[++tp].l=now.x+1,p[tp].r=now.r,p[tp].x=query(now.x+1,now.r);
p[tp].sum=now.sum+a[p[tp].x]-a[now.x],p[tp].pre=now.pre;
hp[++tot]=tp;
up(tot);
}
}
}
int main(){
init();
solve();
return 0;
}
还是说代码有问题,可以在评论中说明。