제출 #1358606

#제출 시각아이디문제언어결과실행 시간메모리
1358606silence25서열 (APIO23_sequence)C++20
12 / 100
87 ms36420 KiB
#include "sequence.h"
#include "bits/stdc++.h"

#define ff first
#define ss second
#define pp pop_back
#define ll long long
#define pb push_back
#define ls(v) (int)v.size()
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define wr cout << "------------------------" << endl

using namespace std;

const int INF = 1e9 + 7;
const int N = 5e5 + 5;
int a[N];
int p1[N];
int p2[N];
int p3[N];
int v1[N];
int v2[N];
int v3[N];
int v4[N];
int seg1[N << 2];
int seg2[N << 2];
int seg3[N << 2];
int seg4[N << 2];

void build1(int nd, int s, int e){
	if(s == e){
		seg1[nd] = v1[s];
		return;
	}
	int mid = s + e >> 1;
	build1(nd << 1, s, mid);
	build1(nd << 1 | 1, mid + 1, e);
	seg1[nd] = max(seg1[nd << 1], seg1[nd << 1 | 1]);
}

void build2(int nd, int s, int e){
	if(s == e){
		seg2[nd] = v2[s];
		return;
	}
	int mid = s + e >> 1;
	build2(nd << 1, s, mid);
	build2(nd << 1 | 1, mid + 1, e);
	seg2[nd] = max(seg2[nd << 1], seg2[nd << 1 | 1]);
}

void build3(int nd, int s, int e){
	if(s == e){
		seg3[nd] = v3[s];
		return;
	}
	int mid = s + e >> 1;
	build3(nd << 1, s, mid);
	build3(nd << 1 | 1, mid + 1, e);
	seg3[nd] = max(seg3[nd << 1], seg3[nd << 1 | 1]);
}

void build4(int nd, int s, int e){
	if(s == e){
		seg4[nd] = v4[s];
		return;
	}
	int mid = s + e >> 1;
	build4(nd << 1, s, mid);
	build4(nd << 1 | 1, mid + 1, e);
	seg4[nd] = max(seg4[nd << 1], seg4[nd << 1 | 1]);
}

int qry1(int nd, int s, int e, int pos, int val){
	if(s > pos) return -1;
	if(s == e) return s;
	int mid = s + e >> 1;
	if(seg1[nd << 1] >= val) return qry1(nd << 1, s, mid, pos, val);
	else return qry1(nd << 1 | 1, mid + 1, e, pos, val);
}

int qry2(int nd, int s, int e, int pos, int val){
	if(s > pos) return -1;
	if(s == e) return s;
	int mid = s + e >> 1;
	if(seg2[nd << 1] >= val) return qry2(nd << 1, s, mid, pos, val);
	else return qry2(nd << 1 | 1, mid + 1, e, pos, val);
}

int qry3(int nd, int s, int e, int pos, int val){
	if(s > pos) return -1;
	if(s == e) return s;
	int mid = s + e >> 1;
	if(seg3[nd << 1] >= val) return qry3(nd << 1, s, mid, pos, val);
	else return qry3(nd << 1 | 1, mid + 1, e, pos, val);
}

int qry4(int nd, int s, int e, int pos, int val){
	if(s > pos) return -1;
	if(s == e) return s;
	int mid = s + e >> 1;
	if(seg4[nd << 1] >= val) return qry4(nd << 1, s, mid, pos, val);
	else return qry4(nd << 1 | 1, mid + 1, e, pos, val);
}

int sequence(int n, vector<int> A) {
	int ans = 1;
	for(int i = 1;i<=n;++i) a[i] = A[i - 1];
	for(int i = 1;i<=n;++i){
		p1[i] = p1[i - 1] + (a[i] == 1);
		p2[i] = p2[i - 1] + (a[i] == 2);
		p3[i] = p3[i - 1] + (a[i] == 3);
		v1[i] = p3[i] + p2[i] - p1[i];
		v2[i] = p1[i] + p2[i] - p3[i];
		v3[i] = p3[i] - p1[i] - p2[i];
		v4[i] = p1[i] - p3[i] - p2[i];
	}
	build1(1, 1, n);
	build2(1, 1, n);
	build3(1, 1, n);
	build4(1, 1, n);
	for(int i = 2;i<=n;++i){
		int r1 = qry1(1, 1, n, i - 1, v1[i]);
		int r2 = qry2(1, 1, n, i - 1, v2[i]);
		int r3 = qry3(1, 1, n, i - 1, v3[i]);
		int r4 = qry4(1, 1, n, i - 1, v4[i]);
		if(r1 > 0) ans = max(ans, p1[i] - p1[r1]);
		if(r3 > 0) ans = max(ans, p2[i] - p2[r3]);
		if(r4 > 0) ans = max(ans, p2[i] - p2[r4]);
		if(r2 > 0) ans = max(ans, p3[i] - p3[r2]);
		if(p1[i] >= p2[i] + p3[i]) ans = max(ans, p1[i]);
		if(p3[i] >= p1[i] + p2[i]) ans = max(ans, p3[i]);
		if(p2[i] >= abs(p1[i] - p3[i])) ans = max(ans, p2[i]);
	}
	return ans;
}

/*
7
1 2 3 1 2 1 3

9
1 1 2 3 4 3 2 1 1

14
2 6 2 5 3 4 2 1 4 3 5 6 3 2


*/
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…