История изменений
Исправление firkax, (текущая версия) :
Я понимаю, что ты даже не попробовав решить эту задачу, так лихо размышляешь о том, как это просто сделать. И условие, по твоему мнению, такое понятное и простое. Но это все ровно до того момента, пока ты не докажешь, что можешь за 15 минут решить эту задачу на практике (уже не докажешь).
Попробовал. Ушло не 15 минут, а 22. Писалось в один проход без переделываний и переносов кода. Пришлось уточнить на php.net как работают его функции fgets() и strcmp() (ничего неожиданного там не увидел, но опасался вдруг они работают не так). И исправить два бага - забыл первый аргумент для explode() (пробел) и переставил $bestExp=0 на $bestExp=-1 т.к. с первым некорректно работало.
<?php
if(!($fp=fopen('php://stdin','r'))) exit;
$team = array();
$all = array();
$curT = 1;
if(($ln=fgets($fp))===FALSE) { echo "missing N\n"; exit; }
$N = intval($ln);
if($N<1 || $N>300000) { echo "wrong N\n"; exit; }
for($j=1; $j<=$N; $j++) {
if(($ln=fgets($fp))===FALSE) { echo "missing event $j\n"; exit; }
list($S, $T) = explode(' ',trim($ln),2);
if(strlen($S)<1 || strlen($S)>10) { echo "wrong S at event $j\n"; exit; }
$T = intval($T);
if($T<1 || $T>1000000000 || $T<$curT) { echo "wrong T at event $j\n"; exit; }
if($T>$curT) {
$dt = $T-$curT;
foreach($team as $name=>$time) $all[$name] += $dt;
$curT = $T;
}
if(isset($team[$S])) unset($team[$S]);
else { $team[$S] = $T; if(!isset($all[$S])) $all[$S] = 0; }
$bestName = FALSE; $bestExp = -1; $expSum = 0;
foreach($team as $name=>$time) {
$exp = $all[$name];
$expSum += $exp;
if($exp>$bestExp || $exp===$bestExp && strcmp($name,$bestName)<0) { $bestName=$name; $bestExp=$exp; }
}
if($bestName===FALSE) { echo "bad input at event $j\n"; exit; }
echo "$bestName ".($expSum-2*$bestExp)."\n";
}
уже не докажешь
Ну, можешь не верить. Я начал после написания предыдущего коммента а после написания проги ещё 3-4 минуты писал/оформлял этот коммент.
Исправление firkax, :
Я понимаю, что ты даже не попробовав решить эту задачу, так лихо размышляешь о том, как это просто сделать. И условие, по твоему мнению, такое понятное и простое. Но это все ровно до того момента, пока ты не докажешь, что можешь за 15 минут решить эту задачу на практике (уже не докажешь).
Попробовал. Ушло не 15 минут, а 22. Писалось в один проход без переделываний и переносов кода. Пришлось уточнить на php.net как работают его функции fgets() и strcmp(). И исправить два бага - забыл первый аргумент для explode() (пробел) и переставил $bestExp=0 на $bestExp=-1 т.к. с первым некорректно работало.
<?php
if(!($fp=fopen('php://stdin','r'))) exit;
$team = array();
$all = array();
$curT = 1;
if(($ln=fgets($fp))===FALSE) { echo "missing N\n"; exit; }
$N = intval($ln);
if($N<1 || $N>300000) { echo "wrong N\n"; exit; }
for($j=1; $j<=$N; $j++) {
if(($ln=fgets($fp))===FALSE) { echo "missing event $j\n"; exit; }
list($S, $T) = explode(' ',trim($ln),2);
if(strlen($S)<1 || strlen($S)>10) { echo "wrong S at event $j\n"; exit; }
$T = intval($T);
if($T<1 || $T>1000000000 || $T<$curT) { echo "wrong T at event $j\n"; exit; }
if($T>$curT) {
$dt = $T-$curT;
foreach($team as $name=>$time) $all[$name] += $dt;
$curT = $T;
}
if(isset($team[$S])) unset($team[$S]);
else { $team[$S] = $T; if(!isset($all[$S])) $all[$S] = 0; }
$bestName = FALSE; $bestExp = -1; $expSum = 0;
foreach($team as $name=>$time) {
$exp = $all[$name];
$expSum += $exp;
if($exp>$bestExp || $exp===$bestExp && strcmp($name,$bestName)<0) { $bestName=$name; $bestExp=$exp; }
}
if($bestName===FALSE) { echo "bad input at event $j\n"; exit; }
echo "$bestName ".($expSum-2*$bestExp)."\n";
}
уже не докажешь
Ну, можешь не верить. Я начал после написания предыдущего коммента а после написания проги ещё 3-4 минуты писал/оформлял этот коммент.
Исходная версия firkax, :
Я понимаю, что ты даже не попробовав решить эту задачу, так лихо размышляешь о том, как это просто сделать. И условие, по твоему мнению, такое понятное и простое. Но это все ровно до того момента, пока ты не докажешь, что можешь за 15 минут решить эту задачу на практике (уже не докажешь).
Попробовал. Ушло не 15 минут, а 22. Писалось в один проход без переделываний и переносов кода. Пришлось уточнить на php.net как работают его функции fgets() и strcmp(). И исправить два бага - забыл первый аргумент для explode() (пробел) и переставил $bestExp=0 на $bestExp=-1 т.к. с первым некорректно работало.
<?php
if(!($fp=fopen('php://stdin','r'))) exit;
$team = array();
$all = array();
$curT = 1;
if(($ln=fgets($fp))===FALSE) { echo "missing N\n"; exit; }
$N = intval($ln);
if($N<1 || $N>300000) { echo "wrong N\n"; exit; }
for($j=1; $j<=$N; $j++) {
if(($ln=fgets($fp))===FALSE) { echo "missing event $j\n"; exit; }
list($S, $T) = explode(' ',trim($ln),2);
if(strlen($S)<1 || strlen($S)>10) { echo "wrong S at event $j\n"; exit; }
$T = intval($T);
if($T<1 || $T>1000000000 || $T<$curT) { echo "wrong T at event $j\n"; exit; }
if($T>$curT) {
$dt = $T-$curT;
foreach($team as $name=>$time) $all[$name] += $dt;
$curT = $T;
}
if(isset($team[$S])) unset($team[$S]);
else { $team[$S] = $T; if(!isset($all[$S])) $all[$S] = 0; }
$bestName = FALSE; $bestExp = -1; $expSum = 0;
foreach($team as $name=>$time) {
$exp = $all[$name];
$expSum += $exp;
if($exp>$bestExp || $exp===$bestExp && strcmp($name,$bestName)<0) { $bestName=$name; $bestExp=$exp; }
}
if($bestName===FALSE) { echo "bad input at event $j\n"; exit; }
echo "$bestName ".($expSum-2*$bestExp)."\n";
}
уже не докажешь
Ну, можешь не верить. Я начал после написания предыдущего коммента а после написания проги ещё 4 минуты писал этот коммент.