Submission #1307888

#TimeUsernameProblemLanguageResultExecution timeMemory
1307888codereliteCat Exercise (JOI23_ho_t4)C++20
41 / 100
51 ms12436 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 200000;
int n;
int a[N],lc[N],rc[N];

void make_tree(void){
	stack<int>st;
	for(int i=0;i<n;i++){
		while(!st.empty()){
			int x=st.top();
			if(a[x]>a[i])break;
			lc[i]=x;
			st.pop();
		}
		if(!st.empty())rc[st.top()]=i;
		st.push(i);
	}
	return;
}

long long dfs(int k){
	long long lcand=0,rcand=0;
	if(lc[k]>=0)lcand=dfs(lc[k])+(k-lc[k]); //abs(k-lc[k])=k-lc[k]
	if(rc[k]>=0)rcand=dfs(rc[k])+(rc[k]-k); //abs(k-rc[k])=rc[k]-k
	return max(lcand,rcand);
}

int main(void){
	int rt=-1;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
		lc[i]=-1, rc[i]=-1;
		if(a[i]==n)rt=i;
	}
	make_tree();
	cout << dfs(rt) << endl;
	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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...