結果
| 問題 |
No.284 門松と魔法(2)
|
| コンテスト | |
| ユーザー |
yosupot
|
| 提出日時 | 2015-09-19 11:35:21 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,626 bytes |
| コンパイル時間 | 1,048 ms |
| コンパイル使用メモリ | 113,420 KB |
| 実行使用メモリ | 12,672 KB |
| 最終ジャッジ日時 | 2024-07-19 07:53:54 |
| 合計ジャッジ時間 | 3,024 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 25 WA * 15 |
ソースコード
#include <iostream>
#include <cstdio>
#include <cassert>
#include <cstring>
#include <vector>
#include <valarray>
#include <array>
#include <queue>
#include <set>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <algorithm>
#include <cmath>
#include <complex>
#include <random>
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
/**
* RangeMinQuery
*
* 区間系データ構造の中ではFenwick Treeの次あたりに有名?
* 値の変更と区間の最小値がO(logn)で処理できる
*
* template引数のint Sは要素数が2^Sであることを示す
*/
template <int S>
struct RangeMinQuery {
static const int N = 1<<S;
typedef ll D;
static const D INF = 1LL<<62;
D seg[2*N];
void init() {
fill_n(seg, 2*N, -INF);
}
void init(int n, D x[]) {
init();
for (int i = 0; i < n; i++) {
seg[i+N] = x[i];
}
for (int i = N-1; i >= 1; i--) {
seg[i] = max(seg[i*2], seg[i*2+1]);
}
}
/// i番目の要素をxにする
void set(int i, D x) {
i += N;
seg[i] = x;
while (i) {
i /= 2;
seg[i] = max(seg[i*2], seg[i*2+1]);
}
}
/// [a, b)での最小値を求める
D get(int a, int b, int k = 1, int l = 0, int r = N) {
if (r <= a || b <= l) return -INF;
if (a <= l && r <= b) return seg[k];
int md = (l+r)/2;
D dl = get(a, b, k*2, l, md);
D dr = get(a, b, k*2+1, md, r);
return max(dl, dr);
}
};
const int MN = 100100;
int n;
int a[MN];
RangeMinQuery<17> rm1, rm2;
int solve() {
rm1.init(); rm2.init();
rm1.set(a[0], 1);
rm2.set(a[0], 1);
// printf("te %d %lld \n", a[0], rm1.get(1, 2));
// for (int i = 0; i < n; i++) {
// printf("%d ", a[i]);
// } printf("\n");
for (int i = 1; i < n; i++) {
rm1.set(a[i], max(rm1.get(a[i], a[i]+1), 1+rm2.get(0, a[i])));
rm2.set(a[i], max(rm2.get(a[i], a[i]+1), 1+rm1.get(a[i]+1, MN)));
// printf("rm1 ");
// for (int j = 0; j <= n; j++) {
// printf("%lld ", rm1.get(j, j+1));
// } printf("\n");
// printf("rm2 ");
// for (int j = 0; j <= n; j++) {
// printf("%lld ", rm2.get(j, j+1));
// } printf("\n");
}
int re = max(rm1.get(0, MN), rm2.get(0, MN));
if (re <= 2) re = 0;
return re;
}
int main() {
cin >> n;
set<int> s;
for (int i = 0; i < n; i++) {
cin >> a[i];
s.insert(a[i]);
}
vector<int> v(s.begin(), s.end());
for (int i = 0; i < n; i++) {
a[i] = lower_bound(v.begin(), v.end(), a[i]) - v.begin();
}
cout << solve() << endl;
return 0;
}
yosupot