題目描述
為了保護科普盧星區的和平,大主教阿塔尼斯每時每刻都在指揮部隊抗擊肆虐的蟲群,最近,阿塔尼斯把目光投向了又一顆布滿蟲群的星球,在這次行動中,阿塔尼斯計劃使用狂熱者鏟除星球上的蟲群威脅,
狂熱者是星靈的基本近戰兵種,每個狂熱者有一個攻擊力 atk 和一個攻擊范圍 r,在狂熱者發動攻擊時,他會沖向距離最近的異蟲,在這只異蟲處釋放 3 次威力強大的旋風斬,若有多只距離最近的異蟲,他會選擇最早出現的那只,若當前沒有存活的異蟲,那么這只狂熱者會在原地釋放旋風斬,每次旋風斬會對所有與攻擊者距離小于等于 r 的異蟲進行攻擊,對每只異蟲造成 atk 的傷害(生命值減少 atk),
當然,這些異蟲也是不好惹的,每只異蟲具有初始生命值 h,當生命值小于等于 0 時,該異蟲將會死亡(并離開戰場),但是,在一次攻擊中,若一只異蟲受到 3 次旋風斬后仍未死亡,那么它將會對進攻的狂熱者進行反擊,使這個狂熱者不得不離開戰場,
在整個戰役中,按照時間順序依次發生了 n 個事件,事件有以下兩種:
- 異蟲出現,一只初始生命值為 h 的異蟲單位出現在 (x,y)坐標,
- 折躍狂熱者,一個狂熱者被折躍到了 (x,y) 坐標,沖向距離最近的異蟲(若存在)并發動 3 次旋風斬,若此后該狂熱者沒有受到反擊,那么他將會一直留在戰場,但是不會繼續進行攻擊,
你作為阿塔尼斯的副官,想知道戰場的最終情況:每個狂熱者是否離開了戰場,以及每只異蟲是否死亡,
輸入
第一行包含一個整數 n (1≤n≤2×103),代表事件的數量,
接下來 n 行,每行給出一種事件,格式為以下兩種之一:
1 x y h,代表一個生命值為 h 的異蟲出現在了坐標 (x,y),
2 x y atk r,代表一個攻擊力為 atk,攻擊半徑為 r 的狂熱者被折躍到了坐標 (x,y),并立即進行攻擊,
上述所有的x,y,r 均為整數,滿足 0≤∣x∣,∣y∣,r≤108;所有的 atk,h 均為整數,滿足 1≤atk,h≤108,
輸出
輸出 n 行,第 i 行表示第 i 個事件中出現的異蟲或狂熱者最終是否留在戰場,Yes 表示異蟲未死亡或狂熱者未離開戰場,No 表示異蟲死亡或狂熱者離開戰場,大小寫不敏感,
樣例輸入 Copy
5 1 0 0 4 1 0 1 8 2 1 0 1 1 2 1 0 1 1 2 1 0 1 1
樣例輸出 Copy
No No No No Yes
提示
在樣例中,發生了如下事件:
- 事件 1 中,在 (0,0)處出現了一只異蟲,其生命值為 4,
- 事件 2 中,在 (0,1)處新出現了一只異蟲,其生命值為 8,
- 事件 3 中,在 (1,0) 處折躍一只攻擊力為 1,攻擊半徑為 1 的狂熱者,他移動到坐標 (0,0) 后,發動 3 次旋風斬,異蟲 1,2 分別剩余生命值 1,5,隨后狂熱者受到反擊離開戰場,
- 事件 4 中,在 (1,0) 處折躍一只攻擊力為 1,攻擊半徑為 1 的狂熱者,他移動到坐標 (0,0) 后,發動 3 次旋風斬,異蟲 1 死亡,異蟲 2 剩余生命值 2,隨后狂熱者受到反擊離開戰場,
- 事件 5 中,在 (1,0) 處折躍一只攻擊力為 1,攻擊半徑為 1 的狂熱者,他移動到坐標 (0,1) 后,發動 3 次旋風斬,異蟲 2 死亡,狂熱者留在戰場,
因而,最終所有異蟲死亡,只有狂熱者 5 留在戰場,
思路:
一個模擬題,注意一下double的精度不夠,可以使用long long,
#include<bits/stdc++.h>
using namespace std;
const int N = 2e3 + 10;
const int mod = 1e9 + 7;
typedef long long ll;
struct node
{
int x, y;
ll r;
bool death;
}insect[N];
int type[N];
ll dis(int a, int b, int c, int d)
{
return 1LL * (a - c) * (a - c) + 1LL * (b - d) * (b - d);
}
int main()
{
#ifdef LOCAL
freopen("E:/input.txt", "r", stdin);
#endif
int n;
int cnt = 0, tot = 0;
cin >> n;
while (n--)
{
++cnt;
int op;
scanf("%d", &op);
if (op == 1)
scanf("%d%d%lld", &insect[cnt].x, &insect[cnt].y, &insect[cnt].r), type[cnt] = 1;
else
{
type[cnt] = 2;
int x, y, atk, r;
scanf("%d%d%d%d", &x, &y, &atk, &r);
int k = 0;
ll d = 1e18;
for (int i = 1; i <= cnt; i++)
{
if (type[i] == 1 && insect[i].r > 0)
{
if (d > dis(x, y, insect[i].x, insect[i].y))
d = dis(x, y, insect[i].x, insect[i].y), k = i;
}
}
for (int i = 1; i <= cnt; i++)
{
if (!insect[i].death && type[i] == 1 && 1LL * (insect[i].x - insect[k].x) * (insect[i].x - insect[k].x) + 1LL * (insect[i].y - insect[k].y) * (insect[i].y - insect[k].y) <= 1LL * r * r)
{
insect[i].r -= 3LL * atk;
if (insect[i].r <= 0)
insect[i].death = 1;
else
insect[cnt].death = 1;
}
}
}
}
for (int i = 1; i <= cnt; i++)
puts(!insect[i].death ? "Yes" : "No");
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/226962.html
標籤:其他
