結果
問題 | No.335 門松宝くじ |
ユーザー | kimiyuki |
提出日時 | 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言語の場合は開発者のデバッグのため、公開されます。
ただし、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))); | ~~~^~~~~~~~~~~~~~~~~~~
ソースコード
#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; }