結果
| 問題 |
No.596 郵便配達
|
| コンテスト | |
| ユーザー |
ikd
|
| 提出日時 | 2017-12-29 13:00:23 |
| 言語 | D (dmd 2.109.1) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,004 bytes |
| コンパイル時間 | 664 ms |
| コンパイル使用メモリ | 101,320 KB |
| 実行使用メモリ | 109,236 KB |
| 最終ジャッジ日時 | 2024-06-12 23:17:57 |
| 合計ジャッジ時間 | 4,538 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 20 RE * 3 |
ソースコード
void main(){
import std.stdio, std.string, std.conv, std.algorithm;
int n, m; rd(n, m);
auto xs=new int[](m), ls=new int[](m);
auto ys=new int[][](m);
foreach(i; 0..m){
rd(xs[i], ls[i]);
ys[i]=readln.split.to!(int[]);
}
int mn=1_000_000_000;
mn=min(mn, solve(n, m, xs, ls, ys));
foreach(i; 0..m){
xs[i]=(n-xs[i]-1);
foreach(j; 0..ls[i]) ys[i][j]=(n-ys[i][j]-1);
}
mn=min(mn, solve(n, m, xs, ls, ys));
writeln(mn);
}
int solve(int n, int m, int[] xs, int[] ls, int[][] ys){
import std.algorithm;
auto c=new int[](n);
int l=n, r=-1;
foreach(i; 0..m){
l=min(l, xs[i]); r=max(r, xs[i]);
foreach(y; ys[i]){
l=min(l, y); r=max(r, y);
if(y<xs[i]) c[y]++, c[xs[i]]--;
}
}
foreach(i; 1..n) c[i]+=c[i-1];
auto rec=new int[][][](2, 3, 3); // R, LR, RLR
// (st, ed)=(F, F), (T, F), (T, T)
const inf=1_000_000_000;
foreach(t; 0..2)foreach(k; 0..3) fill(rec[t][k], inf);
rec[l&1][1][0]=2;
if(c[l]==0) rec[l&1][0][1]=1;
for(auto i=l+1; i<r; i++){
auto t=i&1;
auto nex=rec[t], cur=rec[t^1];
foreach(k; 0..3) fill(nex[k], inf);
foreach(j; 0..3){
chmin(nex[2][j], cur[0][j]+3);
chmin(nex[1][j], cur[1][j]+2);
chmin(nex[2][j], cur[2][j]+3);
if(c[i]==0){
if(j<=1) chmin(nex[0][j], cur[0][j]+1);
if(j==0) chmin(nex[0][j+1], cur[1][j]+1);
chmin(nex[0][j], cur[2][j]+1);
}
if(j==1) chmin(nex[1][j+1], cur[0][j]+2);
}
}
int ret=inf;
chmin(ret, min(rec[(r&1)^1][0][2], rec[(r&1)^1][1][2]));
chmin(ret, min(rec[(r&1)^1][0][1], rec[(r&1)^1][1][1]));
chmin(ret, rec[(r&1)^1][1][0]);
return ret;
}
void chmin(T)(ref T l, T r){
if(l>r) l=r;
}
void rd(T...)(ref T x){
import std.stdio, std.string, std.conv;
auto l=readln.split;
assert(l.length==x.length);
foreach(i, ref e; x){
e=l[i].to!(typeof(e));
}
}
void wr(T...)(T x){
import std.stdio;
foreach(e; x) write(e, " ");
writeln();
}
ikd