結果
| 問題 |
No.335 門松宝くじ
|
| コンテスト | |
| ユーザー |
btk
|
| 提出日時 | 2016-04-03 17:03:36 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 16 ms / 2,000 ms |
| コード長 | 3,191 bytes |
| コンパイル時間 | 3,377 ms |
| コンパイル使用メモリ | 161,584 KB |
| 実行使用メモリ | 9,728 KB |
| 最終ジャッジ日時 | 2024-10-02 12:37:39 |
| 合計ジャッジ時間 | 2,546 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 10 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> V;
namespace MIN_SPARSE_TABLE{
#define SIZE 1000000
int mem[2][SIZE];
//#defube CNT 100
//int mems[CNT][SIZE];
};
template <typename T>
class min_sparse_table{
private:
T *Ltable,*Rtable;int _size;
void build(){for(int k = _size,b=1 ;b*2<=_size; k+=_size,b<<=1)for(int i = 0; i < _size; i++){if(i+b*2<=_size)Ltable[k+i]=min(Ltable[k-_size+i],Ltable[k-_size+i+b]);if(i+b*2>=-1)Rtable[k+i]=min(Rtable[k-_size+i],Rtable[k-_size+i-b]);}}
public:/*methods*/
int size(){return _size;}
T get(int l,int r){int k=(31-__builtin_clz(r-l+1))*_size;return min(Ltable[k+l],Rtable[k+r]);}
min_sparse_table(std::vector<T> &v):Ltable(MIN_SPARSE_TABLE::mem[0]),Rtable(MIN_SPARSE_TABLE::mem[1]){_size=v.size();for(int i = 0; i < _size; i++)Ltable[i]=Rtable[i]=v[i];build();}
min_sparse_table(T* v,int n):Ltable(MIN_SPARSE_TABLE::mem[0]),Rtable(MIN_SPARSE_TABLE::mem[1]){_size=n;for(int i = 0; i < _size; i++)Ltable[i]=Rtable[i]=v[i];build();}
};
namespace MAX_SPARSE_TABLE{
#define SIZE 1000000
int mem[2][SIZE];
//#defube CNT 100
//int mems[CNT][SIZE];
};
template <typename T>
class max_sparse_table{
private:
T *Ltable,*Rtable;int _size;
void build(){for(int k = _size,b=1 ;b*2<=_size; k+=_size,b<<=1)for(int i = 0; i < _size; i++){if(i+b*2<=_size)Ltable[k+i]=max(Ltable[k-_size+i],Ltable[k-_size+i+b]);if(i+b*2>=-1)Rtable[k+i]=max(Rtable[k-_size+i],Rtable[k-_size+i-b]);}}
public:/*methods*/
int size(){return _size;}
T get(int l,int r){int k=(31-__builtin_clz(r-l+1))*_size;return max(Ltable[k+l],Rtable[k+r]);}
max_sparse_table(std::vector<T> &v):Ltable(MAX_SPARSE_TABLE::mem[0]),Rtable(MAX_SPARSE_TABLE::mem[1]){_size=v.size();for(int i = 0; i < _size; i++)Ltable[i]=Rtable[i]=v[i];build();}
max_sparse_table(T* v,int n):Ltable(MAX_SPARSE_TABLE::mem[0]),Rtable(MAX_SPARSE_TABLE::mem[1]){_size=n;for(int i = 0; i < _size; i++)Ltable[i]=Rtable[i]=v[i];build();}
};
int solve(V& v){
int n=v.size();
int res=0;
max_sparse_table<int> s(v);
min_sparse_table<int> t(v);
for(int i = 0; i < n; i++){
for(int j = i+1; j < n; j++){
int top=0;
if(i>0){
if(v[i]>v[j]){int g=t.get(0,i-1);if(g<v[i])top=max(top,v[i]);}
else {int g=s.get(0,i-1);if(g>v[i])top=max(top,max(g,v[j]));}
}
if(j-i>1){
{int g=s.get(i+1,j-1);if(g>max(v[i],v[j]))top=max(g,top);}
{int g=t.get(i+1,j-1);if(g<min(v[i],v[j]))top=max(max(v[i],v[j]),top);}
}
if(j<n-1){
if(v[i]<v[j]){int g=t.get(j+1,n-1);if(g<v[j])top=max(top,v[j]);}
else {int g=s.get(j+1,n-1);if(g>v[j])top=max(top,max(g,v[i]));}
}
//cout<<i<<j<<top<<endl;
res+=top;
}
}
//cout<<res<<endl;
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int N,M;
cin>>N>>M;
int id=0;
int top=0;
V v(N);
for(int i = 0; i < M; i++){
for(auto& it : v)cin>>it;
int t=solve(v);
if(t>top){
top=t;
id=i;
}
}
cout<<id<<endl;
return 0;
}
btk