답안 #128151

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
128151 2019-07-10T13:14:44 Z 구재현(#3116) AAQQZ (JOI15_aaqqz) C++14
0 / 100
52 ms 35704 KB
#include <bits/stdc++.h>
using namespace std;
using pi = pair<int, int>;
using lint = long long;
const int MAXN = 3005;

int n, c, a[MAXN];
int dp[MAXN][MAXN];

struct ds{
	int cnt[MAXN], zeroes;
	void init(){
		memset(cnt, 0, sizeof(cnt));
		zeroes = c + 1;
	}
	void add(int x, int v){
		if(cnt[x] == 0) zeroes--;
		cnt[x] += v;
		if(cnt[x] == 0) zeroes++;
	}
	int query(){ return zeroes; }
}ds;

int f(int x, int y){
	if(x < 0 || y >= n) return 0;
	return dp[x][y];
}

int lcp(vector<int> &s, vector<int> &t){
	for(int i=0; i<s.size(); i++){
		if(s[i] != t[i]) return i;
	}
	return s.size();
}

int solve(int x, int y, vector<int> F, vector<int> G, int ignore){
	for(int i=0; i+1<F.size(); i++){
		if(F[i] > F[i + 1]){
			F.resize(i + 1);
			break;
		}
	}
	ds.init();
	int ptr = 0, cnt = 0, ret = 0;
	vector<int> s, t;
	for(auto &i : G){
		if(i == ignore){
			cnt++;
			if(s == t) ret = max(ret, cnt + 2 * ptr + f(x - ptr, y + cnt + ptr));
			else ret = max(ret, cnt + 2 * lcp(s, t));
			continue;
		}
		if(ptr < F.size()){
			s.push_back(F[ptr++]);
		}
		t.push_back(i);
		sort(t.begin(), t.end());
		if(s == t) ret = max(ret, cnt + 2 * ptr + f(x - ptr, y + cnt + ptr));
		else ret = max(ret, cnt + 2 * lcp(s, t));
	}
	return ret;
}

int solve(){
	memset(dp, 0, sizeof(dp));
	for(int i=0; i<n; i++){
		for(int j=i+1; j<n; j++){
			if(a[i] == a[j]) dp[i][j] = (i > 0 ? dp[i-1][j+1] : 0) + 1;
			else dp[i][j] = 0;
		}
	}

	int ret = 0;
	for(int i=0; i<n; i++){
		int p = 0;
		while(i - p >= 0 && i + p < n && a[i - p] == a[i + p]) p++;
		vector<int> L, R;
		for(int j=i-p; j>=0; j--) L.push_back(a[j]);
		for(int j=i+p; j<n; j++) R.push_back(a[j]);
		ret = max(ret, 2 * p - 1 + solve(i - p, i + p, L, R, -1));
	}
	for(int i=1; i<n; i++){
		int p = 0;
		while(i - p - 1 >= 0 && i + p < n && a[i - p - 1] == a[i + p]) p++;
		vector<int> L, R;
		for(int j=i-p-1; j>=0; j--) L.push_back(a[j]);
		for(int j=i+p; j<n; j++) R.push_back(a[j]);
		ret = max(ret, 2 * p + solve(i - p - 1, i + p, L, R, -1));
	}
	for(int i=0; i<n-1; i++){
		int nxt = -1;
		for(int j=i+1; j<n; j++){
			if(a[i] > a[j]){
				nxt = j;
				break;
			}
		}
		if(nxt != -1){
			vector<int> L, R;
			for(int j=i; j>=0; j--) L.push_back(a[j]);
			for(int j=i+1; j<n; j++){
				R.push_back(a[j]);
			}
			ret = max(ret, solve(i, i + 1, L, R, a[nxt]));
		}
	}
	return ret;
}

int main(){
	int cnt[MAXN] = {};
	cin >> n >> c;
	for(int i=0; i<n; i++){
		cin >> a[i];
		cnt[a[i]]++;
	}
	int ret = *max_element(cnt, cnt + MAXN);
	ret = max(ret, solve());
	for(int i=0; i<n; i++) a[i] = c + 1 - a[i];
	reverse(a, a + n);
	ret = max(ret, solve());
	cout << ret << endl;
}


Compilation message

aaqqz.cpp: In function 'int lcp(std::vector<int>&, std::vector<int>&)':
aaqqz.cpp:30:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<s.size(); i++){
               ~^~~~~~~~~
aaqqz.cpp: In function 'int solve(int, int, std::vector<int>, std::vector<int>, int)':
aaqqz.cpp:37:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i+1<F.size(); i++){
               ~~~^~~~~~~~~
aaqqz.cpp:53:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(ptr < F.size()){
      ~~~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 40 ms 35704 KB Output is correct
2 Correct 40 ms 35704 KB Output is correct
3 Correct 40 ms 35704 KB Output is correct
4 Correct 40 ms 35704 KB Output is correct
5 Correct 39 ms 35704 KB Output is correct
6 Correct 40 ms 35704 KB Output is correct
7 Correct 40 ms 35676 KB Output is correct
8 Correct 52 ms 35704 KB Output is correct
9 Correct 39 ms 35704 KB Output is correct
10 Correct 40 ms 35704 KB Output is correct
11 Correct 40 ms 35704 KB Output is correct
12 Incorrect 39 ms 35704 KB Output isn't correct
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 40 ms 35704 KB Output is correct
2 Correct 40 ms 35704 KB Output is correct
3 Correct 40 ms 35704 KB Output is correct
4 Correct 40 ms 35704 KB Output is correct
5 Correct 39 ms 35704 KB Output is correct
6 Correct 40 ms 35704 KB Output is correct
7 Correct 40 ms 35676 KB Output is correct
8 Correct 52 ms 35704 KB Output is correct
9 Correct 39 ms 35704 KB Output is correct
10 Correct 40 ms 35704 KB Output is correct
11 Correct 40 ms 35704 KB Output is correct
12 Incorrect 39 ms 35704 KB Output isn't correct
13 Halted 0 ms 0 KB -