Test Message

d575: 末日審判

內容

傳說在「巴拉巴拉巴拉」(王國名稱)王國曾經有一個被屠殺的小鎮叫做「巴拉巴拉巴拉」(小鎮名稱)
後來「巴拉巴拉巴拉」王國有一群「巴拉巴拉巴拉」(也許是科學家或魔法師之類的)
他們研究發現,「巴拉巴拉巴拉」小鎮被屠村原來是因為遭到了天譴。
特別的是,末日審判的範圍是十字型擴張的。

在方格座標上(假設最中央的格子是 0,0,右 0,1,上-1,0,左 0,-1,下 1,0),
假如範圍是 1,中心座標是 0,0,那麼末日審判的範圍即是下圖的 ● 部分…

○○○○○
○○●○○
○●●●○
○○●○○
○○○○○

範圍 2

○○●○○
○●●●○
●●●●●
○●●●○
○○●○○

範圍 3

○○○●○○○
○○●●●○○
○●●●●●○
●●●●●●●
○●●●●●○
○○●●●○○
○○○●○○○

現在給定審判的中心座標、以及「巴拉巴拉巴拉」王國首都「巴拉巴拉巴拉」(城市名稱)的位置、審判範圍,
請你判斷首都會不會遭受天遣而滅亡。


輸入

共計 10 個測資點。

每個測資點有多組測試資料。
每組測資一行。
第一和第二個數字是天遣的中心座標,
第三和第四個數字是王國首都的座標,(所有座標值保證介於-2147483648~2147483647 之間)
第五個數字是天遣的有效範圍 r(1<=r<=2147483647)

0 0 1 1 1
0 0 1 1 2
0 0 -1 2 3
-1 0 1 2 3
0 0 50 50 100
0 0 50 50 99

輸出

如果首都座標在天遣的範圍內而招致滅亡,請輸出 die
如果首都座標不在天遣範圍而逃過一劫,請輸出 alive

alive
die
die
alive
die
alive


解題思路

審判的距離為曼哈頓距離,所以先求出審判起點和王都的曼哈頓距離後和審判距離比較即可。

輸入測資很大,記得做輸入優化。


完整程式碼

正常版

AC (0.4s, 104KB)
#include <stdio.h>

long long gap(long long num1, long long num2)
{
return num1 > num2 ? num1 - num2 : num2 - num1;
}

int main()
{
long long dx, dy, cx, cy, da;
while (scanf(" %lld %lld %lld %lld %lld", &dx, &dy, &cx, &cy, &da) == 5)
{
puts(gap(dx, cx) + gap(dy, cy) > da ? "alive" : "die");
}
return 0;
}

輸入優化版

AC (78ms, 1.1MB)
#include <stdio.h>
#define BUFSIZ 1048576

inline char readChar()
{
static char buffer[BUFSIZ], * now = buffer + BUFSIZ, * end = buffer + BUFSIZ;
if (now == end)
{
if (end < buffer + BUFSIZ)
return EOF;
end = (buffer + fread(buffer, 1, BUFSIZ, stdin));
now = buffer;
}
return *now++;
}

inline char readLongLong(long long* dst)
{
register char ch;
while ((ch = readChar()) < '-')
if (ch == EOF) return 0;
if (ch == '-')
{
*dst = readChar() ^ '0';
while ((ch = readChar()) >= '0')
* dst = (*dst << 3) + (*dst << 1) + (ch ^ '0');
*dst = ~*dst + 1;
}
else
{
*dst = ch ^ '0';
while ((ch = readChar()) >= '0')
* dst = (*dst << 3) + (*dst << 1) + (ch ^ '0');
}
return 1;
}

long long gap(long long num1, long long num2)
{
return num1 > num2 ? num1 - num2 : num2 - num1;
}

int main()
{
long long dx, dy, cx, cy, da;
while (readLongLong(&dx) & readLongLong(&dy) & readLongLong(&cx) & readLongLong(&cy) & readLongLong(&da))
{
puts(gap(dx, cx) + gap(dy, cy) > da ? "alive" : "die");
}
return 0;
}