結果
問題 | No.335 門松宝くじ |
ユーザー | koyumeishi |
提出日時 | 2016-01-16 01:38:15 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 46 ms / 2,000 ms |
コード長 | 4,357 bytes |
コンパイル時間 | 842 ms |
コンパイル使用メモリ | 99,992 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-09-19 19:48:32 |
合計ジャッジ時間 | 1,706 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 1 ms
6,944 KB |
testcase_02 | AC | 1 ms
6,944 KB |
testcase_03 | AC | 1 ms
6,944 KB |
testcase_04 | AC | 2 ms
6,944 KB |
testcase_05 | AC | 12 ms
6,944 KB |
testcase_06 | AC | 17 ms
6,940 KB |
testcase_07 | AC | 30 ms
6,940 KB |
testcase_08 | AC | 29 ms
6,940 KB |
testcase_09 | AC | 44 ms
6,944 KB |
testcase_10 | AC | 46 ms
6,940 KB |
testcase_11 | AC | 46 ms
6,940 KB |
testcase_12 | AC | 46 ms
6,944 KB |
testcase_13 | AC | 45 ms
6,944 KB |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:111:30: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 111 | scanf("%d", &a[i][j]); | ~~~~~^~~~~~~~~~~~~~~~
ソースコード
#include <iostream> #include <vector> #include <cstdio> #include <sstream> #include <map> #include <string> #include <algorithm> #include <queue> #include <cmath> #include <functional> #include <set> #include <ctime> #include <random> #include <cassert> using namespace std; template<class T> istream& operator >> (istream& is, vector<T>& vec){for(T& val: vec) is >> val; return is;} template<class T> istream& operator , (istream& is, T& val){ return is >> val;} template<class T> ostream& operator << (ostream& os, vector<T>& vec){for(int i=0; i<vec.size(); i++) os << vec[i] << (i==vec.size()-1?"\n":" ");return os;} template<class T> ostream& operator , (ostream& os, T& val){ return os << " " << val;} template<class T> ostream& operator >> (ostream& os, T& val){ return os << " " << val;} bool is_kadomatsu_sequence(vector<int> x){ if(x.size() != 3) return false; if(x[0] < x[1] && x[1] > x[2] && x[2] != x[0]) return true; if(x[0] > x[1] && x[1] < x[2] && x[2] != x[0]) return true; return false; } template<class T=int> class SparseTable{ int col; int row; T default_value; vector<T>* values; vector<vector<T>> table; static T default_evaluate(T a, T b){ return min(a,b); } function<T(T,T)> evaluate; public: SparseTable(int len, T default_value_ = 100000000, function<T(T,T)> eval = default_evaluate) : col(len), default_value(default_value_) { evaluate = eval; row = 1; while((1<<row) < col) row += 1; row++; table = vector<vector<T>>(row, vector<T>(col, default_value)); } SparseTable(vector<T>& vec, T default_value_ = 100000000, function<T(T,T)> eval = default_evaluate) : col(vec.size()), default_value(default_value_){ evaluate = eval; row = 1; while((1<<row) < col) row += 1; row++; table = vector<vector<T>>(row, vector<T>(col, default_value)); set(vec); } void set(vector<T>& vec){ assert(col == vec.size()); values = &vec; vector<T>& val = vec; iota(table[0].begin(), table[0].end(), 0); for(int k=1; k<row; k++){ for(int i=0; i + (1<<k)-1 < col; i++){ T left = val[table[k-1][i]]; T right = val[table[k-1][i+(1<<(k-1))]]; if(left == evaluate(left,right)){ table[k][i] = table[k-1][i]; }else{ table[k][i] = table[k-1][i+(1<<(k-1))]; } } } } //[l,r) T get(int l, int r){ if(l>=r) return default_value; vector<T>& val = *values; T ret = default_value; int k = 0; while((1<<(k+1)) < (r-l)) k++; T left = val[ table[k][l] ]; T right = val[ table[k][r-(1<<k)] ]; ret = evaluate(left, right); return ret; } }; int main(){ int n,m; cin >> n,m; vector<vector<int>> a(m, vector<int>(n)); //cin >> a; for(int i=0; i<m; i++){ for(int j=0; j<n; j++){ scanf("%d", &a[i][j]); } } function<int(int,int)> my_min = [&](int l, int r){return min(l,r);}; function<int(int,int)> my_max = [&](int l, int r){return max(l,r);}; long long max_ = 0; int val = 0; for(int i=0; i<m; i++){ SparseTable<int> st_min(a[i], 2000, my_min); SparseTable<int> st_max(a[i], -1, my_max); long long sum = 0; for(int x=0; x<n; x++){ for(int y=x+1; y<n; y++){ int ans = 0; int l = a[i][x]; int r = a[i][y]; if(l<r){ // z > l < r if(x>0){ int z = st_max.get(0,x); if(z > l){ int hoge = max(z, r); if(ans<hoge){ ans = hoge; } } } }else{ // z < l > r if(x>0){ int z = st_min.get(0,x); if(z < l){ int hoge = l; if(ans<hoge){ ans = hoge; } } } } if(r-l > 1){ // l < z > r int z = st_max.get(l+1, r); if(z > max(l,r)){ int hoge = z; if(ans<hoge){ ans = hoge; } } // l > z < r z = st_min.get(l+1, r); if(z < min(l,r)){ int hoge = max(l,r); if(ans<hoge){ ans = hoge; } } } if(l<r){ // l < r > z if(n-r > 1){ int z = st_min.get(r+1, n); if(z < r){ int hoge = r; if(ans<hoge){ ans = hoge; } } } }else{ // l > r < z if(n-r > 1){ int z = st_max.get(r+1, n); if(z > r){ int hoge = max(l,z); if(ans<hoge){ ans = hoge; } } } } sum += ans; } } if(max_ < sum){ max_ = sum; val = i; } } cout << val << endl; return 0; }