結果
問題 | No.335 門松宝くじ |
ユーザー | rickytheta |
提出日時 | 2016-01-15 23:55:46 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 319 ms / 2,000 ms |
コード長 | 3,058 bytes |
コンパイル時間 | 1,926 ms |
コンパイル使用メモリ | 172,656 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-09-19 19:37:07 |
合計ジャッジ時間 | 4,525 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
6,812 KB |
testcase_01 | AC | 1 ms
6,940 KB |
testcase_02 | AC | 2 ms
6,944 KB |
testcase_03 | AC | 1 ms
6,940 KB |
testcase_04 | AC | 2 ms
6,940 KB |
testcase_05 | AC | 79 ms
6,944 KB |
testcase_06 | AC | 118 ms
6,944 KB |
testcase_07 | AC | 217 ms
6,940 KB |
testcase_08 | AC | 198 ms
6,944 KB |
testcase_09 | AC | 318 ms
6,940 KB |
testcase_10 | AC | 314 ms
6,944 KB |
testcase_11 | AC | 312 ms
6,944 KB |
testcase_12 | AC | 319 ms
6,940 KB |
testcase_13 | AC | 318 ms
6,940 KB |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:76:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 76 | scanf("%d%d",&n,&m); | ~~~~~^~~~~~~~~~~~~~ main.cpp:85:18: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 85 | REP(i,n)scanf("%d",&(lot[i])); | ~~~~~^~~~~~~~~~~~~~~~
ソースコード
#include <bits/stdc++.h> using namespace std; typedef int ll; typedef vector<int> vi; typedef vector<ll> vl; typedef complex<double> P; typedef pair<int,int> pii; #define REP(i,n) for(ll i=0;i<n;++i) #define REPR(i,n) for(ll i=1;i<n;++i) #define FOR(i,a,b) for(ll i=a;i<b;++i) #define DEBUG(x) cout<<#x<<": "<<x<<endl #define DEBUG_VEC(v) cout<<#v<<":";REP(i,v.size())cout<<" "<<v[i];cout<<endl #define ALL(a) (a).begin(),(a).end() #define MOD (ll)(1e9+7) #define ADD(a,b) a=((a)+(b))%MOD #define FIX(a) ((a)%MOD+MOD)%MOD #define INF 1000000000 // http://www.slideshare.net/iwiwi/ss-3578491 struct rmq{ int n; vi datmin; vi datmax; rmq(){} void init(int _n){ n = 1; while(n<_n) n<<=1; datmin.assign(2*n,0); REP(i,2*n-1)datmin[i] = INF; datmax.assign(2*n,0); REP(i,2*n-1)datmax[i] = -INF; } void update(int i,int x){ i += n-1; datmin[i] = x; datmax[i] = x; while(i>0){ i = (i-1)/2; datmin[i] = min(datmin[i*2+1],datmin[i*2+2]); datmax[i] = max(datmax[i*2+1],datmax[i*2+2]); } } int _min(int a,int b,int k,int l,int r){ if(r<=a||b<=l)return INF; if(a<=l&&r<=b)return datmin[k]; else{ int vl = _min(a,b,k*2+1,l,(l+r)/2); int vr = _min(a,b,k*2+2,(l+r)/2,r); return min(vl,vr); } } int qmin(int a,int b){ return _min(a,b,0,0,n); } int _max(int a,int b,int k,int l,int r){ if(r<=a||b<=l)return -INF; if(a<=l&&r<=b)return datmax[k]; else{ int vl = _max(a,b,k*2+1,l,(l+r)/2); int vr = _max(a,b,k*2+2,(l+r)/2,r); return max(vl,vr); } } int qmax(int a,int b){ return _max(a,b,0,0,n); } }; int main(){ int n,m; scanf("%d%d",&n,&m); // length : n // alternatives : m // 2個選ぶ→O(n^2) ll mxval = -1; ll ans = -1; REP(x,m){ ll lot[n]; REP(i,n)scanf("%d",&(lot[i])); rmq Q; Q.init(n); REP(i,n)Q.update(i,lot[i]); ll res = 0; REP(i,n)REP(j,i){ // ~~~ j ~~~~ i ~~~~ ll left = lot[j]; ll right = lot[i]; ll mx = 0; // cout<<"i:"<<i<<" j:"<<j<<endl; // cout<<"left:"<<left<<" right:"<<right<<endl; if(left<right){ // (↑)↓↑ int a = Q.qmax(0,j); if(a>left) mx = max(mx,max(a,right)); // ↓(↑)↓ int b = Q.qmax(j+1,i); if(b>right) mx = max(mx,b); // ↑(↓)↑ int c = Q.qmin(j+1,i); if(c<left) mx = max(mx,right); // ↓↑(↓) int d = Q.qmin(i+1,n); if(d<right) mx = max(mx,right); }else{ // (↓)↑↓ int a = Q.qmin(0,j); if(a<left) mx = max(mx,left); // ↓(↑)↓ int b = Q.qmax(j+1,i); if(b>left) mx = max(mx,b); // ↑(↓)↑ int c = Q.qmin(j+1,i); if(c<right) mx = max(mx,left); // ↑↓(↑) int d = Q.qmax(i+1,n); if(d>right) mx = max(mx,max(d,left)); } res += mx; } if(res > mxval){ mxval = res; ans = x; } } cout << ans << endl; return 0; }