Submission #1159197

#TimeUsernameProblemLanguageResultExecution timeMemory
1159197alexander7070703단 점프 (JOI19_jumps)C++20
0 / 100
44 ms18248 KiB
#include<bits/stdc++.h>
#define MAXN 400007
using namespace std;

struct tower{
	int val,pos;

	inline friend bool operator < (tower a,tower b){
		return a.val>b.val;
	}
};

int n,ans;
tower a[MAXN];

int maxs[MAXN][20];
int lg[MAXN];

void calc(){
	for(int j=1;j<20;j++){
		for(int i=1;i+(1<<j)-1<=n;i++){
			maxs[i][j]=max( maxs[i][j-1] , maxs[i+(1<<(j-1))][j-1] );
		}
	}

	for(int i=2;i<=n;i++)lg[i]=lg[i/2]+1;
}

int getmax(int l,int r){
	if(l>r)return 0;

	int len=r-l+1;
	return max( maxs[l][lg[len]] , maxs[r-(1<<lg[len])+1][lg[len]] );
}

int main(){

	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin>>n;

	for(int i=1;i<=n;i++){
		cin>>a[i].val;
		a[i].pos=i;

		maxs[i][0]=a[i].val;
	}

	sort(a+1,a+n+1);
	calc();

	for(int i=1;i<=min(n,500);i++){
		for(int f=i+1;f<=min(n,500);f++){
			int c=a[i].pos,d=a[f].pos;

			if(c>d)swap(c,d);
			ans=max(ans,a[i].val + a[f].val + getmax(c+1,(c+d)/2));
			ans=max(ans,a[i].val + a[f].val + getmax(max(c-(d-c),1),c-1));
			ans=max(ans,a[i].val + a[f].val + getmax(d+(d-c),n));
		}
	}

	cout<<ans<<"\n";

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...