結果

問題 No.335 門松宝くじ
ユーザー kimiyukikimiyuki
提出日時 2016-02-11 22:43:06
言語 C++11
(gcc 11.4.0)
結果
CE  
(最新)
AC  
(最初)
実行時間 -
コード長 3,522 bytes
コンパイル時間 851 ms
コンパイル使用メモリ 74,588 KB
最終ジャッジ日時 2024-11-14 19:33:26
合計ジャッジ時間 1,383 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。

コンパイルメッセージ
main.cpp: In constructor ‘segment_tree<T>::segment_tree(int, T, F)’:
main.cpp:31:24: error: there are no arguments to ‘log2’ that depend on a template parameter, so a declaration of ‘log2’ must be available [-fpermissive]
   31 |         n = pow(2,ceil(log2(a_n)));
      |                        ^~~~
main.cpp:31:24: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
main.cpp: In instantiation of ‘segment_tree<T>::segment_tree(int, T, F) [with F = nc2_expected_value(int, const std::vector<int>&)::<lambda(int, int)>; T = int]’:
main.cpp:64:73:   required from here
main.cpp:31:28: error: ‘log2’ was not declared in this scope
   31 |         n = pow(2,ceil(log2(a_n)));
      |                        ~~~~^~~~~
main.cpp:31:23: error: ‘ceil’ was not declared in this scope
   31 |         n = pow(2,ceil(log2(a_n)));
      |                   ~~~~^~~~~~~~~~~
main.cpp:31:16: error: ‘pow’ was not declared in this scope
   31 |         n = pow(2,ceil(log2(a_n)));
      |             ~~~^~~~~~~~~~~~~~~~~~~
main.cpp: In instantiation of ‘segment_tree<T>::segment_tree(int, T, F) [with F = nc2_expected_value(int, const std::vector<int>&)::<lambda(int, int)>; T = int]’:
main.cpp:65:73:   required from here
main.cpp:31:28: error: ‘log2’ was not declared in this scope
   31 |         n = pow(2,ceil(log2(a_n)));
      |                        ~~~~^~~~~
main.cpp:31:23: error: ‘ceil’ was not declared in this scope
   31 |         n = pow(2,ceil(log2(a_n)));
      |                   ~~~~^~~~~~~~~~~
main.cpp:31:16: error: ‘pow’ was not declared in this scope
   31 |         n = pow(2,ceil(log2(a_n)));
      |             ~~~^~~~~~~~~~~~~~~~~~~

ソースコード

diff #

#include <iostream>
#include <vector>
#include <algorithm>
#include <array>
#include <set>
#include <map>
#include <queue>
#include <tuple>
#include <unordered_set>
#include <unordered_map>
#include <functional>
#include <cstdio>
#include <cassert>
#define repeat(i,n) for (int i = 0; (i) < (n); ++(i))
#define repeat_from(i,m,n) for (int i = (m); (i) < (n); ++(i))
#define repeat_reverse(i,n) for (int i = (n)-1; (i) >= 0; --(i))
#define repeat_from_reverse(i,m,n) for (int i = (n)-1; (i) >= (m); --(i))
#define dump(x)  cerr << #x << " = " << (x) << endl
#define debug(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" << " " << __FILE__ << endl
typedef long long ll;
using namespace std;
template <typename T> bool setmax(T & l, T const & r) { if (not (l < r)) return false; l = r; return true; }
template <typename T>
struct segment_tree { // on monoid
    int n;
    vector<T> a;
    function<T (T,T)> append; // associative
    T unit;
    template <typename F>
    segment_tree(int a_n, T a_unit, F a_append) {
        n = pow(2,ceil(log2(a_n)));
        a.resize(2*n-1, a_unit);
        unit = a_unit;
        append = a_append;
    }
    void point_update(int i, T z) {
        a[i+n-1] = z;
        for (i = (i+n)/2; i > 0; i /= 2) {
            a[i-1] = append(a[2*i-1], a[2*i]);
        }
    }
    T range_concat(int l, int r) {
        return range_concat(0, 0, n, l, r);
    }
    T range_concat(int i, int il, int ir, int l, int r) {
        if (l <= il and ir <= r) {
            return a[i];
        } else if (ir <= l or r <= il) {
            return unit;
        } else {
            return append(
                    range_concat(2*i+1, il, (il+ir)/2, l, r),
                    range_concat(2*i+2, (il+ir)/2, ir, l, r));
        }
    }
};
bool is_kadomatsu(int a, int b, int c) {
    if (a == b or b == c or c == a) return false;
    if (a < b and b < c) return false;
    if (a > b and b > c) return false;
    return true;
}
ll nc2_expected_value(int n, vector<int> const & e) {
    segment_tree<int> mint(n, n+1, [](int a, int b) { return min(a,b); });
    segment_tree<int> maxt(n,   0, [](int a, int b) { return max(a,b); });
    repeat (i,n) {
        mint.point_update(i, e[i]);
        maxt.point_update(i, e[i]);
    }
    ll result = 0;
    repeat (i,n) {
        repeat_from (j,i+1,n) {
            int l, mn, mx, r;
            if (e[i] < e[j]) {
                l  = maxt.range_concat(0,i);
                mn = mint.range_concat(i+1,j);
                mx = maxt.range_concat(i+1,j);
                r  = mint.range_concat(j+1,n);
            } else {
                l  = mint.range_concat(0,i);
                mn = mint.range_concat(i+1,j);
                mx = maxt.range_concat(i+1,j);
                r  = maxt.range_concat(j+1,n);
            }
            int a = 0;
            if (i   != 0 and is_kadomatsu(l,  e[i], e[j])) setmax(a, l  + e[i] + e[j]);
            if (i+1 != j and is_kadomatsu(e[i], mn, e[j])) setmax(a, mn + e[i] + e[j]);
            if (i+1 != j and is_kadomatsu(e[i], mx, e[j])) setmax(a, mx + e[i] + e[j]);
            if (j != n-1 and is_kadomatsu(e[i], e[j],  r)) setmax(a, r  + e[i] + e[j]);
            result += a;
        }
    }
    return result;
}
int main() {
    int n, m; cin >> n >> m;
    vector<vector<int> > e(m, vector<int>(n));
    repeat (y,m) repeat (x,n) cin >> e[y][x];
    vector<ll> a(m); repeat (y,m) a[y] = nc2_expected_value(n, e[y]);
    cout << max_element(a.begin(), a.end()) - a.begin() << endl;
    return 0;
}
0