結果
| 問題 |
No.335 門松宝くじ
|
| コンテスト | |
| ユーザー |
btk
|
| 提出日時 | 2016-01-16 01:09:13 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 15 ms / 2,000 ms |
| コード長 | 2,340 bytes |
| コンパイル時間 | 1,544 ms |
| コンパイル使用メモリ | 163,600 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-09-19 19:46:36 |
| 合計ジャッジ時間 | 2,035 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 10 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> V;
int mintable[1000][20][2];
int maxtable[1000][20][2];
void table_build(V& v){
int n=v.size();
for(int i = 0; i < n; i++)maxtable[i][0][0]=v[i];
for(int i = 0; i < n; i++)mintable[i][0][0]=v[i];
for(int i = 1; i < 20; i++)
for(int j = 0; j < n; j++)if(j+(1<<i)<=n){
maxtable[j][i][0]=max(maxtable[j][i-1][0],maxtable[j+(1<<(i-1))][i-1][0]);
mintable[j][i][0]=min(mintable[j][i-1][0],mintable[j+(1<<(i-1))][i-1][0]);
}
for(int i = 0; i < n; i++)maxtable[i][0][1]=v[i];
for(int i = 0; i < n; i++)mintable[i][0][1]=v[i];
for(int i = 1; i < 20; i++)
for(int j = 0; j < n; j++)if(j-(1<<i)>=-1){
maxtable[j][i][1]=max(maxtable[j][i-1][1],maxtable[j-(1<<(i-1))][i-1][1]);
mintable[j][i][1]=min(mintable[j][i-1][1],mintable[j-(1<<(i-1))][i-1][1]);
}
}
inline int getmax(int i,int j){
int k=31-__builtin_clz(j-i+1);
return max(maxtable[i][k][0],maxtable[j][k][1]);
}
inline int getmin(int i,int j){
int k=31-__builtin_clz(j-i+1);
return min(mintable[i][k][0],mintable[j][k][1]);
}
int solve(V& v){
int n=v.size();
int res=0;
table_build(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=getmin(0,i-1);if(g<v[i])top=max(top,v[i]);}
else {int g=getmax(0,i-1);if(g>v[i])top=max(top,max(g,v[j]));}
}
if(j-i>1){
{int g=getmax(i+1,j-1);if(g>max(v[i],v[j]))top=max(g,top);}
{int g=getmin(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=getmin(j+1,n-1);if(g<v[j])top=max(top,v[j]);}
else {int g=getmax(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