結果
| 問題 |
No.335 門松宝くじ
|
| コンテスト | |
| ユーザー |
rickytheta
|
| 提出日時 | 2016-01-15 23:55:46 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.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 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 10 |
コンパイルメッセージ
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;
}
rickytheta