為了得到書法大家的真傳,小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,...