提出 #59655696


ソースコード 拡げる

<?php
[$N] = ints();
for($i = 0; $i < $N; $i++)[$X1[], $Y1[]] = ints();
for($i = 0; $i < $N; $i++)[$X2[], $Y2[]] = ints();
$maxScore = 0;
$bestSize = 0;
for($split = 1; $split <= 20; $split++){
    //o("split: $split");
    $score = 0;
    unset($used, $added, $done);

    $size = floor(100000/$split);
    $map = array_fill(0, $split, array_fill(0, $split, 0));
    $added = array_fill(0, $split, array_fill(0, $split, " "));
    for($i = 0; $i < $N; $i++)$map[intdiv($X1[$i],$size)][intdiv($Y1[$i],$size)]++;
    for($i = 0; $i < $N; $i++)$map[intdiv($X2[$i],$size)][intdiv($Y2[$i],$size)]--;
    //o($map);
    foreach($map as $x => $row){
        foreach($row as $y => $v){
            $map2[$x][$y] = $v > 0 ? intdiv($v, 100)+1 : 0;
        }
    }
    $max = 0;
    $maxX = 0; $maxY = 0;
    for($i = 0; $i < $split; $i++){
        for($j = 0; $j < $split; $j++){
            if(chmax($max, $map[$i][$j])){
                $maxX = $i;
                $maxY = $j;
            }
        }
    }
    $xy = [[-1,0],[1,0],[0,-1],[0,1]];
    $length = 4*$size;
    $pq = new SplPriorityQueue();
    $used[$maxX][$maxY] = true;
    foreach($xy as list($dx, $dy)){
        if(isset($done[$maxX+$dx][$maxY+$dy]))continue;
        $done[$maxX+$dx][$maxY+$dy] = true;
        if(isset($map[$maxX+$dx][$maxY+$dy])){
            $pq->insert([$maxX+$dx, $maxY+$dy], $map[$maxX+$dx][$maxY+$dy]);
        }
    }
    while($pq->valid()){
        [$x, $y] = $pq->extract();
        $filledCellCountInAdjecentArea = 0;
        foreach($xy as list($dx, $dy)){
            if(isset($added[$x+$dx][$y+$dy]) && $added[$x+$dx][$y+$dy]===true)$filledCellCountInAdjecentArea++;
        }
        if($filledCellCountInAdjecentArea == 1){
            $length += 2*$size;
        }elseif($filledCellCountInAdjecentArea == 3){
            $length -= 2*$size;
        }
        //if($length>400000)break;
        $added[$x][$y] = true;
        $score += $map[$x][$y];
        //o($score);
        foreach($xy as list($dx, $dy)){
            if(isset($done[$x+$dx][$y+$dy]))continue;
            $done[$x+$dx][$y+$dy] = true;
            if(isset($map[$x+$dx][$y+$dy])){
                $pq->insert([$x+$dx, $y+$dy], $map[$x+$dx][$y+$dy]);
            }
        }
        if($length<=400000 && isValidAdded($added)){
            if(chmax($maxScore, $score)){
                $ans = $added;
                $bestSize = $size;
            }
        }
    }

}
error_log(strval($maxScore));
$N = 0;
$size = $bestSize;
//o($ans);
//exit;
foreach($ans as $x => $row){
    foreach($row as $y => $v){
        if($v === true){//今のセルが使っていて
            if(($ans[$x-1][$y]??" ") === " "){//左が使っていない
                $line[$x*$size][$y*$size] = [$x*$size, $y*$size+$size];$N++;
                $cx = $x*$size;
                $cy = $y*$size;
            }
            if(($ans[$x+1][$y]??" ") === " "){//右が使っていない
                $line[$x*$size+$size][$y*$size+$size] = [$x*$size+$size, $y*$size];$N++;
            }
            if(($ans[$x][$y-1]??" ") === " "){//上が使っていない
                $line[$x*$size+$size][$y*$size] = [$x*$size, $y*$size];$N++;
            }
            if(($ans[$x][$y+1]??" ") === " "){//下が使っていない
                $line[$x*$size][$y*$size+$size] = [$x*$size+$size, $y*$size+$size];$N++;
            }
        }
    }
}
echo $N, "\n";
//o($cy);
for($i = 0; $i < $N; $i++){
    echo $cx, " ", $cy, "\n";
    [$cx, $cy] = $line[$cx][$cy];
}

function isValidAdded($added){
    global $split;
    // $addedで" "が1に囲われている場所があればNG
    // $addedを上下左右1マス拡張する
    $added2 = array_fill(0, $split+2, array_fill(0, $split+2, ' '));
    for($i = 0; $i < $split; $i++){
        for($j = 0; $j < $split; $j++){
            $added2[$i+1][$j+1] = $added[$i][$j];
        }
    }
    //o($added2);
    // added2 を外から幅深さ優先探索で" "を1に変えていく
    $xy = [[-1,0],[1,0],[0,-1],[0,1]];
    $done = array_fill(0, $split+2, array_fill(0, $split+2, false));
    $done[0] = $done[$split+1] = array_fill(0, $split+2, true);
    foreach($done as $row)$row[0] = $row[$split+1] = true;
    $done[1][1] = true;
    $queue = new SplQueue();
    $queue->enqueue([1,1]);
    while(!$queue->isEmpty()){
        [$x, $y] = $queue->dequeue();
        foreach($xy as list($dx, $dy)){
            if(($added2[$x+$dx][$y+$dy]??1) === ' '){
                $added2[$x+$dx][$y+$dy] = 1;
                $queue->enqueue([$x+$dx, $y+$dy]);
            }
        }
    }
    //o($added2);
    // added2 の " " の数を数える
    $voidCount = 0;
    for($i = 0; $i < $split+2; $i++){
        for($j = 0; $j < $split+2; $j++){
            if($added2[$i][$j] === ' ')$voidCount++;
        }
    }
    if($voidCount > 0){
        return false;
    }
    return true;
}

function str(){return trim(fgets(STDIN));}
function ints($n = false){
  if($n===false){
    $str = trim(fgets(STDIN));if($str == '')return [];
    return array_map('intval',explode(' ',$str));
  }else{$ret = [];for($i = 0; $i < $n; $i++)foreach(array_map('intval',explode(' ',trim(fgets(STDIN)))) as $j => $v)$ret[$j][] = $v;return $ret;}
}
function int(){return intval(trim(fgets(STDIN)));}
function chmax(&$a,$b){if($a<$b){$a=$b;return 1;}return 0;}
function chmin(&$a,$b){if($a>$b){$a=$b;return 1;}return 0;}
function isqrt($n):int{$res=intval(sqrt($n))+1;while($res*$res>$n)$res--;return $res;}
function popcount($x){$c=0;while($x){$x&=$x-1;++$c;}return$c;}
function swap(&$a,&$b){$tmp=$a;$a=$b;$b=$tmp;}
function o(...$val){
  if(count($val)==1)$val=array_shift($val);
  echo debug_backtrace()[0]['line'].")";
  if(is_array($val)){
    if(count($val) == 0)echo "empty array\n";
    elseif(!is_array(current($val)))echo "array: ",implode(" ", addIndex($val)),"\n";
    else{
      echo "array:array\n";
      if(isCleanArray($val))foreach($val as $row)echo implode(" ", addIndex($row)),"\n";
      else foreach($val as $i => $row)echo "[".$i."] ".implode(" ", addIndex($row)),"\n";
    }
  }else echo $val."\n";
}
function addIndex($val){if(!isCleanArray($val)){$val = array_map(function($k, $v){return $k.":".$v;}, array_keys($val), $val);}return $val;}
function isCleanArray($array){$clean=true;$i = 0;foreach($array as $k=>$v){if($k != $i++)$clean = false;}return $clean;}
// 座圧対象の配列 -> [圧縮された配列,復元用のMap,圧縮用のMap]
function atsu($array){$a = array_flip($array);$fuku=array_flip($a);sort($fuku);$atsu = array_flip($fuku);foreach($array as $i=>$val)$array[$i]=$atsu[$val];return [$array, $fuku, $atsu];}
function atsu1($array){$a=array_flip($array);$fuku=array_flip($a);sort($fuku);array_unshift($fuku,0);unset($fuku[0]);$atsu=array_flip($fuku);foreach($array as $i=>$val)$array[$i]=$atsu[$val];return [$array, $fuku, $atsu];}
function median($a){sort($a);$n=count($a);return $n%2?$a[($n-1)/2]:($a[$n/2-1]+$a[$n/2])/2;}
function gcdAll($array){$gcd=$array[0];for($i=1,$I=count($array);$i<$I;++$i){$gcd=gcd($gcd,$array[$i]);}return $gcd;}
function gcd($m, $n){if(!$n)return $m;return gcd($n, $m % $n);}
function lcmAll($array){$lcm=$array[0];for($i=1,$I=count($array);$i<$I;++$i){$lcm=lcm($lcm,$array[$i]);}return $lcm;}
function lcm($a, $b) {return $a / gcd($a, $b) * $b;}

提出情報

提出日時
問題 A - Purse Seine Fishing
ユーザ yoichiro
言語 PHP (php 8.2.8)
得点 437342
コード長 7482 Byte
結果 AC
実行時間 92 ms
メモリ 22636 KiB

ジャッジ結果

セット名 test_ALL
得点 / 配点 437342 / 750000
結果
AC × 150
セット名 テストケース
test_ALL test_0000.txt, test_0001.txt, test_0002.txt, test_0003.txt, test_0004.txt, test_0005.txt, test_0006.txt, test_0007.txt, test_0008.txt, test_0009.txt, test_0010.txt, test_0011.txt, test_0012.txt, test_0013.txt, test_0014.txt, test_0015.txt, test_0016.txt, test_0017.txt, test_0018.txt, test_0019.txt, test_0020.txt, test_0021.txt, test_0022.txt, test_0023.txt, test_0024.txt, test_0025.txt, test_0026.txt, test_0027.txt, test_0028.txt, test_0029.txt, test_0030.txt, test_0031.txt, test_0032.txt, test_0033.txt, test_0034.txt, test_0035.txt, test_0036.txt, test_0037.txt, test_0038.txt, test_0039.txt, test_0040.txt, test_0041.txt, test_0042.txt, test_0043.txt, test_0044.txt, test_0045.txt, test_0046.txt, test_0047.txt, test_0048.txt, test_0049.txt, test_0050.txt, test_0051.txt, test_0052.txt, test_0053.txt, test_0054.txt, test_0055.txt, test_0056.txt, test_0057.txt, test_0058.txt, test_0059.txt, test_0060.txt, test_0061.txt, test_0062.txt, test_0063.txt, test_0064.txt, test_0065.txt, test_0066.txt, test_0067.txt, test_0068.txt, test_0069.txt, test_0070.txt, test_0071.txt, test_0072.txt, test_0073.txt, test_0074.txt, test_0075.txt, test_0076.txt, test_0077.txt, test_0078.txt, test_0079.txt, test_0080.txt, test_0081.txt, test_0082.txt, test_0083.txt, test_0084.txt, test_0085.txt, test_0086.txt, test_0087.txt, test_0088.txt, test_0089.txt, test_0090.txt, test_0091.txt, test_0092.txt, test_0093.txt, test_0094.txt, test_0095.txt, test_0096.txt, test_0097.txt, test_0098.txt, test_0099.txt, test_0100.txt, test_0101.txt, test_0102.txt, test_0103.txt, test_0104.txt, test_0105.txt, test_0106.txt, test_0107.txt, test_0108.txt, test_0109.txt, test_0110.txt, test_0111.txt, test_0112.txt, test_0113.txt, test_0114.txt, test_0115.txt, test_0116.txt, test_0117.txt, test_0118.txt, test_0119.txt, test_0120.txt, test_0121.txt, test_0122.txt, test_0123.txt, test_0124.txt, test_0125.txt, test_0126.txt, test_0127.txt, test_0128.txt, test_0129.txt, test_0130.txt, test_0131.txt, test_0132.txt, test_0133.txt, test_0134.txt, test_0135.txt, test_0136.txt, test_0137.txt, test_0138.txt, test_0139.txt, test_0140.txt, test_0141.txt, test_0142.txt, test_0143.txt, test_0144.txt, test_0145.txt, test_0146.txt, test_0147.txt, test_0148.txt, test_0149.txt
ケース名 結果 実行時間 メモリ
test_0000.txt AC 89 ms 21836 KiB
test_0001.txt AC 92 ms 21672 KiB
test_0002.txt AC 90 ms 21852 KiB
test_0003.txt AC 86 ms 21444 KiB
test_0004.txt AC 88 ms 21704 KiB
test_0005.txt AC 88 ms 21716 KiB
test_0006.txt AC 79 ms 21808 KiB
test_0007.txt AC 68 ms 22420 KiB
test_0008.txt AC 64 ms 22436 KiB
test_0009.txt AC 61 ms 22544 KiB
test_0010.txt AC 65 ms 22156 KiB
test_0011.txt AC 66 ms 22492 KiB
test_0012.txt AC 63 ms 22308 KiB
test_0013.txt AC 62 ms 22372 KiB
test_0014.txt AC 60 ms 22592 KiB
test_0015.txt AC 64 ms 22536 KiB
test_0016.txt AC 60 ms 22492 KiB
test_0017.txt AC 66 ms 22444 KiB
test_0018.txt AC 59 ms 22512 KiB
test_0019.txt AC 60 ms 22168 KiB
test_0020.txt AC 63 ms 22284 KiB
test_0021.txt AC 62 ms 22384 KiB
test_0022.txt AC 62 ms 22628 KiB
test_0023.txt AC 61 ms 22336 KiB
test_0024.txt AC 63 ms 22140 KiB
test_0025.txt AC 65 ms 22308 KiB
test_0026.txt AC 64 ms 22152 KiB
test_0027.txt AC 65 ms 22300 KiB
test_0028.txt AC 62 ms 22316 KiB
test_0029.txt AC 63 ms 22320 KiB
test_0030.txt AC 68 ms 22152 KiB
test_0031.txt AC 59 ms 22120 KiB
test_0032.txt AC 71 ms 22428 KiB
test_0033.txt AC 63 ms 22556 KiB
test_0034.txt AC 62 ms 22380 KiB
test_0035.txt AC 70 ms 22116 KiB
test_0036.txt AC 62 ms 22308 KiB
test_0037.txt AC 66 ms 22332 KiB
test_0038.txt AC 64 ms 22472 KiB
test_0039.txt AC 64 ms 22188 KiB
test_0040.txt AC 61 ms 22580 KiB
test_0041.txt AC 65 ms 22396 KiB
test_0042.txt AC 64 ms 22524 KiB
test_0043.txt AC 66 ms 22328 KiB
test_0044.txt AC 62 ms 22124 KiB
test_0045.txt AC 59 ms 22512 KiB
test_0046.txt AC 64 ms 22240 KiB
test_0047.txt AC 62 ms 22404 KiB
test_0048.txt AC 65 ms 22304 KiB
test_0049.txt AC 61 ms 22412 KiB
test_0050.txt AC 62 ms 22136 KiB
test_0051.txt AC 66 ms 22468 KiB
test_0052.txt AC 66 ms 22252 KiB
test_0053.txt AC 59 ms 22388 KiB
test_0054.txt AC 63 ms 22324 KiB
test_0055.txt AC 60 ms 22364 KiB
test_0056.txt AC 69 ms 22364 KiB
test_0057.txt AC 67 ms 22572 KiB
test_0058.txt AC 60 ms 22344 KiB
test_0059.txt AC 64 ms 22408 KiB
test_0060.txt AC 65 ms 22524 KiB
test_0061.txt AC 60 ms 22192 KiB
test_0062.txt AC 64 ms 22552 KiB
test_0063.txt AC 68 ms 22444 KiB
test_0064.txt AC 63 ms 22136 KiB
test_0065.txt AC 60 ms 22400 KiB
test_0066.txt AC 66 ms 22180 KiB
test_0067.txt AC 65 ms 22212 KiB
test_0068.txt AC 60 ms 22472 KiB
test_0069.txt AC 64 ms 22168 KiB
test_0070.txt AC 64 ms 22416 KiB
test_0071.txt AC 62 ms 22384 KiB
test_0072.txt AC 64 ms 22556 KiB
test_0073.txt AC 64 ms 22492 KiB
test_0074.txt AC 62 ms 22396 KiB
test_0075.txt AC 66 ms 22372 KiB
test_0076.txt AC 60 ms 22276 KiB
test_0077.txt AC 61 ms 22340 KiB
test_0078.txt AC 63 ms 22424 KiB
test_0079.txt AC 60 ms 22408 KiB
test_0080.txt AC 65 ms 22464 KiB
test_0081.txt AC 59 ms 22268 KiB
test_0082.txt AC 62 ms 22356 KiB
test_0083.txt AC 64 ms 22188 KiB
test_0084.txt AC 63 ms 22236 KiB
test_0085.txt AC 64 ms 22244 KiB
test_0086.txt AC 63 ms 22260 KiB
test_0087.txt AC 64 ms 22524 KiB
test_0088.txt AC 60 ms 22276 KiB
test_0089.txt AC 65 ms 22328 KiB
test_0090.txt AC 63 ms 22540 KiB
test_0091.txt AC 69 ms 22208 KiB
test_0092.txt AC 68 ms 22332 KiB
test_0093.txt AC 61 ms 22100 KiB
test_0094.txt AC 59 ms 22636 KiB
test_0095.txt AC 61 ms 22560 KiB
test_0096.txt AC 62 ms 22436 KiB
test_0097.txt AC 69 ms 22196 KiB
test_0098.txt AC 63 ms 22456 KiB
test_0099.txt AC 68 ms 22212 KiB
test_0100.txt AC 63 ms 22392 KiB
test_0101.txt AC 66 ms 22536 KiB
test_0102.txt AC 62 ms 22556 KiB
test_0103.txt AC 64 ms 22480 KiB
test_0104.txt AC 63 ms 22240 KiB
test_0105.txt AC 68 ms 22400 KiB
test_0106.txt AC 62 ms 22496 KiB
test_0107.txt AC 73 ms 22248 KiB
test_0108.txt AC 59 ms 22280 KiB
test_0109.txt AC 67 ms 22408 KiB
test_0110.txt AC 64 ms 22360 KiB
test_0111.txt AC 61 ms 22212 KiB
test_0112.txt AC 57 ms 22132 KiB
test_0113.txt AC 62 ms 22328 KiB
test_0114.txt AC 63 ms 22048 KiB
test_0115.txt AC 64 ms 22332 KiB
test_0116.txt AC 63 ms 22292 KiB
test_0117.txt AC 59 ms 22560 KiB
test_0118.txt AC 59 ms 22328 KiB
test_0119.txt AC 60 ms 22496 KiB
test_0120.txt AC 63 ms 22576 KiB
test_0121.txt AC 62 ms 22472 KiB
test_0122.txt AC 59 ms 22260 KiB
test_0123.txt AC 64 ms 22556 KiB
test_0124.txt AC 61 ms 22292 KiB
test_0125.txt AC 62 ms 22384 KiB
test_0126.txt AC 60 ms 22536 KiB
test_0127.txt AC 62 ms 22296 KiB
test_0128.txt AC 65 ms 22136 KiB
test_0129.txt AC 66 ms 22416 KiB
test_0130.txt AC 69 ms 22332 KiB
test_0131.txt AC 65 ms 22120 KiB
test_0132.txt AC 64 ms 22396 KiB
test_0133.txt AC 65 ms 22556 KiB
test_0134.txt AC 67 ms 22200 KiB
test_0135.txt AC 69 ms 22340 KiB
test_0136.txt AC 59 ms 22540 KiB
test_0137.txt AC 62 ms 22428 KiB
test_0138.txt AC 63 ms 22452 KiB
test_0139.txt AC 65 ms 22416 KiB
test_0140.txt AC 65 ms 22396 KiB
test_0141.txt AC 63 ms 22580 KiB
test_0142.txt AC 72 ms 22160 KiB
test_0143.txt AC 62 ms 22352 KiB
test_0144.txt AC 63 ms 22040 KiB
test_0145.txt AC 63 ms 22360 KiB
test_0146.txt AC 60 ms 22336 KiB
test_0147.txt AC 60 ms 22580 KiB
test_0148.txt AC 72 ms 22344 KiB
test_0149.txt AC 59 ms 22224 KiB