《演算法競賽高階指南》0x41並查集 奇偶遊戲

2022-05-20 10:23:58 字數 1352 閱讀 3830

給出長度n,和m條記錄,每條記錄中說明乙個區間中1的數量,其中序列是01序列,問到哪乙個是最後乙個正確的。

可以通過並查集解決,用字首異或和作為一段區間中1的個數的象徵。可以通過「邊帶權」的方式計算也可以通過擴充套件域的方式進行求解。

第一種求解方案:

#include#include

#include

using

namespace

std;

const

int maxn = 10010

;int f[maxn*2],d[maxn*2],a[maxn*2

];struct

nodequery[maxn];

intn,m;

intnum;

int find(int

x)int

get(int

x)int

main()

sort(a+1,a+2*m+1

); num=unique(a+1,a+2*m+1)-(a+1

);

for(int i=1;i<=num;i++)f[i]=i;

for(int i=1;i<=m;i++)

}else

}cout

return0;

}

第二種求解方案:構建擴充套件域,將乙個點可能歸屬的集合拆成兩個推導集。

#include#include

#include

using

namespace

std;

const

int maxn = 10010

;int f[maxn*2

];int a[maxn*2

];int

n,m,num;

struct

nodequery[maxn];

int find(int

x)void union(int x,int

y)int

get(int

x)int

main()

sort(a+1,a+2*m+1

); num=unique(a+1,a+2*m+1)-(a+1

);

for(int i=1;i1;i++)f[i]=i;

for(int i=1;i<=m;i++)

union(x_odd,y_even);

union(y_odd,x_even);

}else

union(x_odd,y_odd);

union(y_even,x_even);}}

cout

return0;

}

演算法競賽高階指南 0x00

快速冪模板,寫一下快速冪的原理。我們知道,乙個數 n 在二進位制 也可以是其他進製 下可以被表示為 a 1 a 2 2 1 a 3 2 2 a m 2 那麼我們可以考慮將其分拆成二進位制狀態下的每一位,然後做冪運算。這樣做的時間複雜度為 o log 2 n 實現的過程類似於倒過來的分治 當然也可以直...

《演算法競賽高階指南》0x32約數

求解 1,n 之間的最大的反素數,有性質 這個反素數是質因數個數最多的數中最小的乙個。證明 假設有乙個數質因數個數比它多,如果在他前面,不滿足反素數的定義,如果在他後面,一定可以找到第乙個質因數比它大的數,這個數作為結果更好,反證可知,這個數質因數一定是最多的 反證 假設有質因數與他的個數一樣但是比...

演算法競賽高階指南 0x11 棧 Editor

通過觀察我們可以將這個序列通過2個棧和2個陣列來維護5種操作進而達到題解,為了方便,直接用陣列來模擬棧 stkl n 游標左邊的棧 stkr n 游標右邊的棧 tl 左棧指標 tr 右棧指標 s n 字首和陣列 f n 最大字首和 對於第乙個操作,在游標處插入x,就是給stkl 的棧頂插入乙個x,字...