BZOJ5109 大吉大利,晚上吃雞!

2022-05-20 05:54:42 字數 1656 閱讀 2861

一張\(n(n\le5\times10^4)\)個點\(m(m\le5\times10^4)\)條邊的無向圖,節點編號為\(1\)到\(n\),邊權為正整數。給定\(s\)和\(t\),顯然從\(s\)到\(t\)的最短路有一種或多種方案。

選擇\(a,b\)兩個點,約定\(a\)點和\(b\)點必須滿足:

所有可能路徑中,必定會經過\(a\)點和\(b\)點中的任意一點;

所有可能路徑中,不存在一條路徑同時經過\(a\)點和\(b\)點。

求滿足上面兩個條件的\(a,b\)點對有多少個,交換\(a,b\)的順序算相同的方案。

首先用dijkstra求出最短路網路,顯然這是乙個dag。

在dag上dp求出乙個點到\(s/t\)的方案數,將它們相乘即為經過這個點的路徑數,記作\(f(i)\)。我們同樣也可以用bitset求出經過這個點的路徑上可能經過的點,記作\(s(i)\)。

而題目所求的\(a\)和\(b\)相當於需要滿足以下兩個條件:

\(f(a)+f(b)=f(t)\);

\(a\notin f(b)\)且\(b\notin f(a)\)。

顯然列舉\(a\)和\(b\)會超時,由於\(f(a)+f(b)=f(t)\)。我們可以開乙個map儲存\(f(b)=f(t)-f(a)\)的可能的\(b\)。

此時我們只需要列舉\(a\),然後在map上查詢對應的\(b\)即可。

#include#include#include#include#include#include#include#includeinline int getint() 

typedef long long int64;

const int n=5e4+1,m=5e4;

struct edge2 ;

edge2 edge[m];

struct edge3 ;

std::vectore3[n];

inline void add_edge(const int &u,const int &v,const int &w) );

e3[v].push_back((edge3));

}bool vis[n];

int n,m,s,t,ind[n],ind2[n],outd[n];

int64 diss[n],dist[n],f[n],g[n],ans;

struct vertex

};inline void dijkstra(const int &s,int64 dis) );

} while(!q.empty()&&q.top().d!=llong_max)

std::queueq;

std::bitsetb[n];

inline void kahn2()

} int cnt=0;

for(register int i=1;i<=n;i++) cnt+=!vis[i];

kahn2();

kahn();

kahn3();

for(register int i=1;i<=n;i++)

for(register int i=1;i<=n;i++)

printf("%lld\n",ans);

return 0;

}

「大吉大利 晚上吃雞」背後有隱藏劇情

絕地求生 大逃殺 成為了新一輪網路紅詞的締造者,如幻影坦克 蹲在草叢裡 伏地魔 趴在任何可能的地方 幻影汽車 藏在汽車下 和車庫伏兵 藏在車庫周圍 而真正最為所有人所熟知的,則是 大吉大利 晚上吃雞 和 平底鍋 兩個。較之過去遊戲結束時出現的 win game over 顯然 大吉大利 晚上吃雞 英...

大吉大利 今晚吃雞 槍械

題目描述 在絕地求生 吃雞 遊戲裡,不同的槍枝有不同的威力,更是可以搭配不同的配件,以提公升槍枝的效能。每一把槍都有其威力及其可裝備配件種類。每乙個配件有其所屬種類,可以為槍枝提供威力的百分比加成。每一把槍只能裝備乙個同類配件。給你n把槍枝和m個配件,槍的威力為p,可裝備的配件數量為k,為k個不同型...

大吉大利,今晚吃雞 槍械篇

在絕地求生 吃雞 遊戲裡,不同的槍枝有不同的威力,更是可以搭配不同的配件,以提公升槍枝的效能。每一把槍都有其威力及其可裝備配件種類。每乙個配件有其所屬種類,可以為槍枝提供威力的百分比加成。每一把槍只能裝備乙個同類配件。給你n把槍枝和m個配件,槍的威力為p,可裝備的配件數量為k,為k個不同型別的配件,...