刷題總結 魔法森林(bzoj3669)

2022-05-23 13:36:14 字數 2719 閱讀 2146

為了得到書法大家的真傳,小e同學下定決心去拜訪住在魔法森林中的隱士。魔法森林可以被看成乙個包含個n節點m條邊的無向圖,節點標號為1..n,邊標號為1..m。初始時小e同學在號節點1,隱士則住在號節點n。小e需要通過這一片魔法森林,才能夠拜訪到隱士。

魔法森林中居住了一些妖怪。每當有人經過一條邊的時候,這條邊上的妖怪就會對其發起攻擊。幸運的是,在號節點住著兩種守護精靈:a型守護精靈與b型守護精靈。小e可以借助它們的力量,達到自己的目的。

只要小e帶上足夠多的守護精靈,妖怪們就不會發起攻擊了。具體來說,無向圖中的每一條邊ei包含兩個權值ai與bi。若身上攜帶的a型守護精靈個數不少於ai,且b型守護精靈個數不少於bi,這條邊上的妖怪就不會對通過這條邊的人發起攻擊。當且僅當通過這片魔法森林的過程中沒有任意一條邊的妖怪向小e發起攻擊,他才能成功找到隱士。

由於攜帶守護精靈是一件非常麻煩的事,小e想要知道,要能夠成功拜訪到隱士,最少需要攜帶守護精靈的總個數。守護精靈的總個數為a型守護精靈的個數與b型守護精靈的個數之和。

第1行包含兩個整數n,m,表示無向圖共有n個節點,m條邊。 接下來m行,第行包含4個正整數xi,yi,ai,bi,描述第i條無向邊。其中xi與yi為該邊兩個端點的標號,ai與bi的含義如題所述。 注意資料中可能包含重邊與自環。

輸出一行乙個整數:如果小e可以成功拜訪到隱士,輸出小e最少需要攜帶的守護精靈的總個數;如果無論如何小e都無法拜訪到隱士,輸出「-1」(不含引號)。

【輸入樣例1】

4 51 2 19 1

2 3 8 12

2 4 12 15

1 3 17 8

3 4 1 17

【輸入樣例2】

3 11 2 1 1

【輸出樣例1】

32【樣例說明1】

如果小e走路徑1→2→4,需要攜帶19+15=34個守護精靈;

如果小e走路徑1→3→4,需要攜帶17+17=34個守護精靈;

如果小e走路徑1→2→3→4,需要攜帶19+17=36個守護精靈;

如果小e走路徑1→3→2→4,需要攜帶17+15=32個守護精靈。

綜上所述,小e最少需要攜帶32個守護精靈。

【輸出樣例2】

-1【樣例說明2】

小e無法從1號節點到達3號節點,故輸出-1。

2<=n<=50,000

0<=m<=100,000

1<=ai ,bi<=50,000

首先將每條邊按照ai的大小排序···然後每次按順序判斷一條邊··如果這條邊兩端點未被連通,則直接將這條邊加入圖中,如果這條邊兩端點的路徑最大b的值大於這條邊的bi的話,那麼存在這條邊加入後答案被更新的可能,那麼就將原來路徑中這條邊對應的兩端點間最大b值對應的邊刪去,而加入這條邊;如果小於則肯定不可能。最後直接判斷1和n是否連通,連通的話找出最大值b和判斷的邊的a的和更新答案即可

注意判斷點與點的連通用並查集來維護,邊的刪去與加入用lct,因為連通圖肯定是一顆樹;另外還有乙個技巧是:為了每次找出最大的b,我們可以把每條加入的邊變成點並賦予點權b,然後維護

其實這道題最核心的一點是開始的排序···想通了這一點其它都好說···

#include#include

#include

#include

using

namespace

std;

const

int max_n=5e4+5

;const

int max_m=1e5+5

;const

int max_n=2e5+5

;const

int inf=2e9;

intn,m,ans,maxa;

int father[max_n],val[max_n],f[max_n],ch[max_n][2

],maxn[max_n],rev[max_n],strack[max_n];

struct hpedge[max_m];

inline

int cmp(hp x,hp y)

inline

int find(int x)

inline

intget(int x)

inline

bool is_root(int x)

inline

void update(int

x) }

if (ch[x][1

]) }

}}inline

void pushdown(intx)}

inline

void rotate(int

x)inline

void splay(int

x)inline

void access(intx)}

inline

void reverse(int

x)inline

void link(int x,int

y)inline

void cut(int x,int

y)inline

int query(int x,int

y)int

main()

else

}if (find(1)==find(n))

}if (ans!=inf) printf("

%d\n

",ans);

else printf("

-1\n");

}

刷題總結 作詩(bzoj2821)

神犇sjy虐完heoi之後給傻 lyd出了一題 shy是t國的公主,平時的一大愛好是作詩。由於時間緊迫,shy作完詩 些漢字構成詩。因為shy喜歡對偶,所以shy規定最後選出的每個漢字都必須在 l,r 裡出現了正偶數次。而且shy認 為選出的漢字的種類數 兩個一樣的漢字稱為同一種 越多越好 為了拿到...

刷題總結 書架(bzoj1861)

小t有乙個很大的書櫃。這個書櫃的構造有些獨特,即書櫃裡的書是從上至下堆放成一列。她用1到n的正整數給每本書都編了號。小t在看書的時候,每次取出一本書,看完後放回書櫃然後再拿下一本。由於這些書太有吸引力了,所以她看完後常常會忘記原來是放在書櫃的什麼位置。不過小t的記憶力是非常好的,所以每次放書的時候至...

刷題總結 天使玩偶(bzoj2716)

學了cdq後近期最後一道題 然而tm還是搞了1個半小時才tm搞出來 先說思路 對於絕對值,我們採取類似於旋轉整個圖的方法,也就是說共計三次翻轉再加上原來的圖,每次旋轉90度,算出點在旋轉後的對應座標 具體看 中的注釋部分 然後對於乙個詢問,每次只算它左上角的點的貢獻,這樣就有乙個三維偏序 時間,x,...