2020 牛客多校3 G(並查集)

2022-08-20 08:36:12 字數 1284 閱讀 2157

就是將乙個集合所有與其直接相連的集合合併,被合併的集合消失。比如1並到0中,那麼0,1所屬的集合都為0。

題目中直接開佇列開不下,改成vector合併集合會t,看大佬的**,發現用鏈式前向星做邊,再加個tail陣列用來o(1)合併就行(也可以用list的splice()合併,都是o(1)的),向當於將另一集合中的所有邊並到這一集合中。

另外得跳過已經被其他集合合併過的點,並且在合併過程中得預先存下tail,因為合併的時候會更新tail

#include using namespace std;

typedef long long ll;

const ll n = 8e5 + 7;

int t;

int n, m;

int head[n], tail[n];

struct edge e[n << 1];

int u, v, cnt = 0;

int f[n];

int q;

inline int read_int()

while ((c < '0' || c > '9') && c != '-');

if (c == '-') sgn = -1;

else ret = c - '0';

while ((c = getchar()) >= '0' && c <= '9') ret = ret * 10 + (c - '0');

return sgn * ret;

}inline ll read_ll()

while ((c < '0' || c > '9') && c != '-');

if (c == '-') sgn = -1;

else ret = c - '0';

while ((c = getchar()) >= '0' && c <= '9') ret = ret * 10 + (c - '0');

return sgn * ret;

}void addedge(int u, int v)

head[u] = cnt;

}int find(int x)

void merge(int u, int v)

void unio(int x, int y)

}int main()

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

q = read_int();

while(q--)

}for (int i = 0; i < n;i++)

}return 0;

}

2020 牛客多校7

a 注意到 sum x i x j n sum x i 2 sum x i 2 dp 求出選 i 個點橫座標總和 x 縱座標總和 y 時距離平方最大值即可 b 先填 lfloor frac rfloor n 個 n 然後遞迴考慮子問題 text 即可 c 2 操作可以用詢問打標記實現,問題相當於每次...

2020牛客多校第二場G

題意 給你兩個序列,問你從第乙個序列中有多少個與第二個序列長度相同的並且對應位置都是大於等於第二個序列的子串。題解 神仙bitset題,維護第二個序列的bitset,例如樣例中的 2 3 3,按照大小排序後維護的m個bitset為 0100,0110,0111,樣例中的資料維護的bitset不是很好...

牛客多校第八場I題 並查集

interesting computer game 題意 給你n對數,然後每對數只能挑乙個數,並且如果這個數在前面被挑過了,那麼就不能被挑選,問最多能挑多少個數 思路 我一開始想到的是拓撲排序,畢竟之前正好刷過這樣類似的幾道題,然並軟,我就是沒有做出來。也有拓撲排序的解法,然而我並沒有想出來。待補 ...