Submission #1167105

#TimeUsernameProblemLanguageResultExecution timeMemory
1167105_rain_Secret (JOI14_secret)C++20
100 / 100
342 ms13184 KiB
#include<bits/stdc++.h>
#include "secret.h"
using namespace std;

typedef long long LL;

const int N=(int)1000;
#define pref asdas
#define suf asdss
int pref[N+2][N+2],suf[N+2][N+2];
int arr[N+2],d[N+2][N+2],ans[N+2][N+2];
bool used[N+2][N+2]={};
int n;

namespace Lyphmm{
	int Secret(int X, int Y){
		return min((LL)X+(LL)2*(Y/2),(LL)1000000000);
	}
};

void build_rig(int l,int r,int dep){
	pref[dep][l]=arr[l];
	for(int i=l+1;i<=r;++i) {
		pref[dep][i]=Secret(pref[dep][i-1],arr[i]);
	}

	return;
}

void dnc(int l,int r,int dep){
	if (used[l][r]) return;
	if (l>r) return;
	if (r-l<=1){
		int m=(l+r)/2;
		used[l][r]=true;
		ans[l][r]=(l==r?arr[l]:Secret(arr[l],arr[r]));
		dnc(l,m,dep+1),dnc(m+1,r,dep+1);
		return;
	}
	int m=(l+r)/2;
	dnc(l,m,dep+1);
	
	for(int i=l;i<=m;++i){
		for(int j=m+1;j<=r;++j) d[i][j]=dep;
	}
	
	for(int i=m;i>=l;--i){
		if (used[i][m]) continue;
		
		for(int j=m-1;j>=i;--j){
			if (used[i][j] && used[j+1][m]){
				ans[i][m]=Secret(ans[i][j],ans[j+1][m]);
				used[i][m]=true;
				break;
			}
		}
		assert(used[i][m]);
	}
	for(int i=m;i>=l;--i) suf[dep][i]=ans[i][m];
	
	build_rig(m+1,r,dep);
	dnc(m+1,r,dep+1);
	return;
}

void Init(int num,int a[]){
	n=num;
	for(int i=1;i<=n;++i) arr[i]=a[i-1];
	dnc(1,n,1);
	return;
}
int Query(int l, int r){
	++l,++r;
	if (used[l][r]) return ans[l][r];
	int m=(l+r)/2;
	int ans=Secret(suf[d[l][r]][l],pref[d[l][r]][r]);
	return ans;
}



#Verdict Execution timeMemoryGrader output
Fetching results...