堆 並查集 牛客模擬賽 牛半仙的魔塔

2021-10-25 07:43:23 字數 2688 閱讀 4220

d −牛

半仙的魔

塔d-牛半仙的魔塔

d−牛半仙的

魔塔牛半仙的妹子被大魔王抓走了,牛半仙為了就他的妹子,前往攻打魔塔。

魔塔為一棵樹,牛半仙初始在一號點。

牛半仙有攻擊,防禦,血量三個屬性。

除一號點外每個點都有魔物防守,魔物也有攻擊,防禦,血量三個屬性。

每個怪物後面都守著一些藍寶石,獲得1藍寶石可增加1防。

牛半仙具有突襲屬性,所以遇到魔物後會率先發動攻擊,然後牛半仙和魔物輪換地攻擊對方。

乙個角色被攻擊一次減少的血量是對方的攻擊減去自己的防禦。

當乙個角色的血量小於等於 0 時,他就會死亡。

當牛半仙第一次到達某個節點時會與這個節點的魔物發生戰鬥。

當乙個魔物死亡後,這個魔物所在的節點就不會再產生新的魔物。

現在牛半仙想知道他打死魔塔的所有魔物後的最大血量。

第一行乙個 n 代表節點數。

隨後 n-1 行,每行兩個數 i,j,表示 i 與 j 節點有邊相連。

隨後一行,三個數,依次為勇士的血量、攻擊、防禦。

隨後 n-1 行,每行四個數,依次為怪物的血量、攻擊、防禦,和其守著的藍寶石數量。

乙個數,代表最大血量。如果牛半仙在打死魔塔的所有魔物之前就已經死亡了,則輸出 -1。

6

1 21 3

1 44 5

5 650000 10 0

35 54 2 4

25 55 3 5

21 51 4 5

20 64 5 3

43 64 6 1

48901
打怪的順序依次為4,3,5,2,6

可以證明不存在更優的方案。

對於20%的資料:n≤15

又有30%的資料:n≤1000,且保證對於每一條邊 (i,j),一定滿足 i=1

對於前90%的資料:n≤1000,且保證對於每一條邊(i,j),一定滿足 j=i+1 或 i=1

對於最後10%的資料:n≤100000,且保證對於每一條邊(i,j),一定滿足 j=i+1 或 i=1

對於100%的資料:有牛半仙血量<5*10^18,攻擊=2000,盔甲防禦=0。

怪物血量為3000~10^6 攻擊5 * 10^5- 7 * 10^5

防禦≤1000,打完乙隻怪後獲得的藍寶石數量為1至5

因為牛半仙攻擊一定,那麼打乙隻怪的次數是不變的

那麼我們考慮攻打點的先後順序

設價效比為打這只

怪獲得的

藍寶石數

量攻打一

只怪所需

次數

\frac

攻打乙隻怪所

需次數打

這只怪獲

得的藍寶

石數量​

然後我們用乙個並查集,如果當前點的父親節點價效比比它兒子小,就並成乙個點

然後我們從1號點出發,每次將可以到達的點加入大根堆維護就好了

考場上沒想到這種做法, 只想到了價效比,但是沒有想到大根堆還有並查集,痛失不知道多少分,血虧

#include

#include

#include

#include

#include

#define ll long long

using

namespace std;

priority_queue < pair <

double

,int

>

> q;

int n, h[

100001

], fa[

100001

], fath[

100001

], x, t;

ll hp[

100001

], ad[

100001

], def[

100001

], num[

100001

], tim[

100001];

bool vis[

100001];

struct node w[

200001];

void

add(

int x,

int y)

; h[x]

= t;

w[++t]

=(node)

; h[y]

= t;

}void

dfs(

int now,

int fath)

}int

find

(int now)

//尋找鋇鋇【誤

intmain()

fath[1]

=1;scanf

("%lld%lld%lld"

,&hp[1]

,&ad[1]

,&def[1]

);//牛半仙的血量攻擊防禦

for(

int i =

2; i <= n;

++i)

dfs(1,

0); vis[1]

=1;while

(!q.

empty()

)printf

("%lld"

, hp[1]

);}

並查集 牛客1080 B

tokitsukaze有n個數,需要按順序把他們插入雜湊表中,雜湊表的位置為0到n 1。插入的規則是 剛開始雜湊表是空的。對於乙個數x,在雜湊表中,如果 x mod n 的位置是空的,就把x放在 x mod n 的位置上。如果不是空的,就從 x mod n 往右開始找到第乙個空的位置插入。若一直到n...

牛客練習賽16C 任意點 並查集

平面上有若干個點,從每個點出發,你可以往東南西北任意方向走,直到碰到另乙個點,然後才可以改變方向。請問至少需要加多少個點,使得點對之間互相可以到達。第一行乙個整數n表示點數 1 n 100 第二行n行,每行兩個整數xi,yi表示座標 1 xi,yi 1000 y軸正方向為北,x軸正方形為東。輸出乙個...

牛客網機試題 最短路徑(並查集)

n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離 第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路 接下來m行兩個整數,表示相連的兩個城市的編號n 1行,表示0號城市到其他城市的最短路,如果無法到達,輸出 ...