Submission #1364514

#TimeUsernameProblemLanguageResultExecution timeMemory
1364514ahmetlbktd4Sequence (APIO23_sequence)C++20
100 / 100
590 ms44056 KiB
#include "bits/stdc++.h"
#include "sequence.h"
#include <cassert>
using namespace std;

const int inf = 1e9;
const int N = 5e5+5;

int trmin[4*N];
int trmax[4*N];
int lz[4*N];

void gur(int nd,int st,int en){
	lz[nd] = 0;
	if (st == en){
		trmin[nd] = st;
		trmax[nd] = st;
		return;
	}
	int m = (st+en)>>1;
	gur(nd<<1,st,m);
	gur(nd<<1|1,m+1,en);
	trmin[nd] = min(trmin[nd<<1],trmin[nd<<1|1]);
	trmax[nd] = max(trmax[nd<<1],trmax[nd<<1|1]);
}

void push(int nd,int st,int en){
	if (lz[nd]){
		trmin[nd] += lz[nd];
		trmax[nd] += lz[nd];
		if (st ^ en){
			lz[nd<<1] += lz[nd];
			lz[nd<<1|1] += lz[nd];
		}
		lz[nd] = 0;
	}
}

void upd(int nd,int st,int en,int l,int r,int x){
	push(nd,st,en);
	if (st > en || st > r || en < l)
	return;
	if (st >= l && en <= r){
		lz[nd] += x;
		push(nd,st,en);
		return;
	}
	int m = (st+en)>>1;
	upd(nd<<1,st,m,l,r,x);
	upd(nd<<1|1,m+1,en,l,r,x);
	trmin[nd] = min(trmin[nd<<1],trmin[nd<<1|1]);
	trmax[nd] = max(trmax[nd<<1|1],trmax[nd<<1]);
}

int querymin(int nd,int st,int en,int l,int r){
	if (st > en || st > r || en < l)
	return inf;
	push(nd,st,en);
	if (st >= l && en <= r)
	return trmin[nd];
	int m = (st + en)>>1;
	return min(querymin(nd<<1,st,m,l,r),querymin(nd<<1|1,m+1,en,l,r));
}

int querymax(int nd,int st,int en,int l,int r){
	if (st > en || st > r || en < l)
	return -inf;
	push(nd,st,en);
	if (st >= l && en <= r)
	return trmax[nd];
	int m = (st+en)>>1;
	return max(querymax(nd<<1,st,m,l,r),querymax(nd<<1|1,m+1,en,l,r));
}

int sequence(int n,vector <int> a){
	vector <vector <int>> in(n+1);
	for (int i = 0;i < n;i++){
		in[a[i]].push_back(i);
	}
	gur(1,0,n);
	int p = 1;
	for (int x = 1;x <= n;x++){
		int m = in[x].size();
		if (!m)
		continue;
		vector <int> l(m),r(m);
		for (int i = 0;i < m;i++){
			l[i] = querymin(1,0,n,0,in[x][i]);
			r[i] = querymax(1,0,n,in[x][i]+1,n);
		}
		for (int i = 0;i < m;i++){
			upd(1,0,n,in[x][i]+1,n,-2);
		}
		vector <int> l1(m),r1(m);
		for (int i = 0;i < m;i++){
			l1[i] = querymax(1,0,n,0,in[x][i]);
			r1[i] = querymin(1,0,n,in[x][i]+1,n);
		}
		for (int i = 0;i < m;i++){
			while (i+p < m){
				int j = i+p;
				if (r[j]-l[i] >= 0 && r1[j]-l1[i] <= 0)
				p++;
				else break;
			}
		}
	}
	return p;
}

// int main() {
// 	freopen("file.in","r",stdin);
//   int N;
//   assert(1 == scanf("%d", &N));

//   std::vector<int> A(N);
//   for (int i = 0; i < N; ++i) {
//     assert(1 == scanf("%d", &A[i]));
//   }

//   int result = sequence(N, A);
//   printf("%d\n", result);
//   return 0;
// }
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...