結果
| 問題 |
No.3368 トッピング
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-11-17 21:18:13 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,512 ms / 2,000 ms |
| コード長 | 1,187 bytes |
| コンパイル時間 | 702 ms |
| コンパイル使用メモリ | 72,552 KB |
| 実行使用メモリ | 7,720 KB |
| 最終ジャッジ日時 | 2025-11-17 21:18:31 |
| 合計ジャッジ時間 | 10,286 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 14 |
ソースコード
#include<iostream>
#include<bitset>
#include<cassert>
using namespace std;
int N,M,C,X;
int A[2000][200];
bitset<2001>dp[3][400];
bitset<2001>R[200];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>N>>M>>C>>X;
for(int i=0;i<N;i++)for(int j=0;j<M;j++)cin>>A[i][j];
long l=-1e9,r=(int)1e9+1;
while(r-l>1)
{
long m=(l+r)/2;
for(int i=0;i<3;i++)for(int j=0;j<M+M;j++)dp[i][j].reset();
{//first
for(int j=0;j<M;j++)
{
if(A[0][j]>=m)dp[1][j+j].set(0);
if(A[0][j]>=m+C&&A[1][j]>=m+C)dp[2][j+j+1].set(2);
}
}
for(int i=1;i<N;i++)
{
const int id=i%3;
const int nid=(i+1)%3;
const int nnid=(i+2)%3;
R[M-1].reset();
for(int j=M-2;j>=0;j--)R[j]=R[j+1]|dp[id][j+j+2]|dp[id][j+j+3];
bitset<2001>L;
L.reset();
for(int j=0;j<M;j++)
{
if(A[i][j]>=m+C)dp[nid][j+j+1]|=dp[id][j+j+1]<<1;
if(A[i][j]>=m)dp[nid][j+j]|=L|R[j];
if(i+1<N&&A[i][j]>=m+C&&A[i+1][j]>=m+C)dp[nnid][j+j+1]|=(L|R[j])<<2;
L|=dp[id][j+j]|dp[id][j+j+1];
}
for(int j=0;j<M+M;j++)dp[id][j].reset();
}
int now=N%3;
bool fn=false;
for(int j=0;j<M+M;j++)if((dp[now][j]>>X).any())fn=true;
if(fn)l=m;
else r=m;
}
cout<<l<<endl;
}