結果
問題 | No.335 門松宝くじ |
ユーザー | roaris |
提出日時 | 2019-12-11 18:31:54 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 677 ms / 2,000 ms |
コード長 | 2,835 bytes |
コンパイル時間 | 2,015 ms |
コンパイル使用メモリ | 182,432 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-24 07:43:58 |
合計ジャッジ時間 | 7,372 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 2 ms
6,944 KB |
testcase_02 | AC | 2 ms
6,940 KB |
testcase_03 | AC | 2 ms
6,944 KB |
testcase_04 | AC | 2 ms
6,944 KB |
testcase_05 | AC | 170 ms
6,940 KB |
testcase_06 | AC | 256 ms
6,940 KB |
testcase_07 | AC | 451 ms
6,940 KB |
testcase_08 | AC | 449 ms
6,940 KB |
testcase_09 | AC | 674 ms
6,944 KB |
testcase_10 | AC | 674 ms
6,944 KB |
testcase_11 | AC | 673 ms
6,940 KB |
testcase_12 | AC | 676 ms
6,940 KB |
testcase_13 | AC | 677 ms
6,940 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; #define INF 2000000000 int my_min(int a, int b) { if (a<b) return a; else return b; } int my_max(int a, int b) { if (a>b) return a; else return b; } struct SegmentTree { int n; function<int(int, int)> func; int ele; vector<int> arr; SegmentTree(int N, int (*f)(int, int), int e) { int n_ = 1; while (n_<N) { n_ *= 2; } n = n_; func = f; ele = e; arr.resize(2*n-1); fill(arr.begin(), arr.end(), e); } void update(int k, int a) { k += n-1; arr[k] = a; while (k>0) { k = (k-1)/2; arr[k] = func(arr[2*k+1], arr[2*k+2]); } } int query_sub(int a, int b, int k, int l, int r) { if (r<=a || b<=l) return ele; if (a<=l && r<=b) return arr[k]; else { int vl = query_sub(a, b, 2*k+1, l, (l+r)/2); int vr = query_sub(a, b, 2*k+2, (l+r)/2, r); return func(vl, vr); } } int query(int a, int b) { return query_sub(a, b, 0, 0, n); } }; int main() { int N, M; cin >> N >> M; int v_max = -1; int ans = -1; for (int m=0; m<M; m++) { int E[N]; SegmentTree st_min = SegmentTree(N, my_min, INF); SegmentTree st_max = SegmentTree(N, my_max, -INF); for (int i=0; i<N; i++) { cin >> E[i]; E[i]--; st_min.update(i, E[i]); st_max.update(i, E[i]); } int v = 0; for (int i=0; i<N; i++) { for (int j=i+1; j<N; j++) { int prof = 0; int min_1 = st_min.query(0, i); int max_1 = st_max.query(0, i); int min_2 = st_min.query(i, j); int max_2 = st_max.query(i, j); int min_3 = st_min.query(j, N); int max_3 = st_max.query(j, N); if (E[i]>E[j]) { if (min_1<E[i]) prof = max(prof, E[i]); if (max_2>E[i]) prof = max(prof, max_2); if (min_2<E[j]) prof = max(prof, E[i]); if (max_3>E[j]) prof = max({prof, E[i], max_3}); } else if (E[i]<E[j]) { if (max_1>E[i]) prof = max({prof, max_1, E[j]}); if (min_2<E[i]) prof = max(prof, E[j]); if (max_2>E[j]) prof = max(prof, max_2); if (min_3<E[j]) prof = max(prof, E[j]); } v += prof; } } if (v_max<v) { v_max = v; ans = m; } } cout << ans << endl; }