loj2048 HNOI2016 最小公倍數

2022-05-07 20:39:08 字數 1701 閱讀 1141

link

給定一張$n$個頂點$m$條邊的無向圖(頂點編號為$1,2,...,n$),每條邊上帶有權值。所有權值都可以分解成$2^a \cdot 3^b$的形式。

現在有$q$個詢問,每次詢問給定$u,v,a,b$,請你求出是否存在一條頂點$u$到$v$之間的路徑,使得路徑依次經過的邊上的權值的最小公倍數為$2^a \cdot 3^b$?

路徑可以不是簡單路徑。

$n,q\leq 5\times 10^4,m\leq 10^5.$

我們用qx,qy,qa,qb表示詢問中的x,y,a,b,ex,ey,ea,eb表示某條邊的x,y,a,b。

如何處理乙個詢問?將ea,eb分別小於等於qa,qb的邊連線起來,若滿足qx,qy連通且$\max\=qa\&\&\max\=qb$,則答案為yes,否則為no。可以用並查集維護。

多個詢問怎麼辦呢?離線。

乙個分塊的思路,將a分成若干塊,每次處理a在當前塊範圍內的詢問。首先詢問按照b排序,對於乙個詢問qa,qb,我們要找所有$ea\leq qa\&\& eb\leq qb$的邊,把它們連起來。

設當前塊a的範圍為$[l,r)$,兩種情況:

$ea$l\leq ea

使用無路徑壓縮並查集按秩合併即可。

複雜度$\mathcal(\sqrt(n+q\log n))$。

1

#pragma gcc optimize("ofast")

2 #include3

#define rep(i,x,y) for (register int i=(x);i<=(y);i++)

4using

namespace

std;

5char

gc()

9 inline int

read()

15const

int n=1e5+5;16

int n,m,q,blo,top,x,y,sz,a,b,fa[n],mxa[n],mxb[n],siz[n]; bool

ans[n];

17struct

node

20 node(){} node(int _x,int _y,int _a,int _b,int _id)

21}e[n],q[n],nq[n],stk[n];

22 inline void up(register int &x,register int y)

23 inline bool cmp_a(const node &x,const node &y)

24 inline bool cmp_b(const node &x,const node &y)

25 inline int getfa(register int x)

26 inline void mer(register int x,register int y,register int a,register int

b)33

intmain()61}

62}63 rep (i,1,q) puts(ans[i]?"

yes":"no"

);64

return0;

65 }

view code

沒錯你會發現我**裡的明顯卡常痕跡。。。

艱辛卡常後的我……發現乙個致命的錯誤:「提取a在當前塊的詢問」這部分,必須寫q[i].a考慮一種極端情況,所有邊和詢問的a全相等,時間複雜度直接退化成$n^2$。

Loj 3057 HNOI2019 校園旅行

某學校的每個建築都有乙個獨特的編號。一天你在校園裡無聊,決定在校園內隨意地漫步。你已經在校園裡呆過一段時間,對校園內每個建築的編號非常熟悉,於是你情不自禁的把周圍每個建築的編號都記了下來 但其實你沒有真的記下來,而是把每個建築的編號除以 2 取餘數得到 0 或 1 作為該建築的標記,多個建築物的標記...

Loj 2568 APIO2016 烟花表演

烟花表演是最引人注目的節日活動之一。在表演中,所有的烟花必須同時 為了確保安全,烟花被安置在遠離開關的位置上,通過一些導火索與開關相連。導火索的連線方式形成一棵樹,烟花是樹葉,如圖 1所示。火花從開關出發,沿導火索移動。每當火花抵達乙個分叉點時,它會擴散到與之相連的所有導火索,繼續燃燒。導火索燃燒的...

題解 HNOI 2016序列

collapse bzoj 這道題在hnoi2016中還算是好的了 這題中如若去掉多組詢問的話可以在o nlogn o n log n 的時間內得解 並查集 但多組詢問必定要優化,發現這種其他結構基本上無法涉足的題目就只能上莫隊了 我也不知道為啥想到莫隊,可能這就是題感吧 減去o nn o n n ...