请求将空间放大
查看原帖
请求将空间放大
479246
封禁用户楼主2022/6/21 21:59

rt.

本人的代码(51pts51pts#52 开始就一直 MLEMLE):

//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;
}

还是说代码有问题,可以在评论中说明。

2022/6/21 21:59
加载中...