CodeForces920E 鍊錶強優化BFS

2022-05-20 03:15:14 字數 2171 閱讀 8422

題意:求乙個圖的補圖的連通分量個數以及每個連通分量裡的點個數

如果這不是乙個補圖,bfs或者並查集可過,但是補圖顯然是乙個稠密圖,o(n2)的演算法會t,但我們依然可以用bfs來直接跑,但是需要用到鍊錶來進行優化,對於一般的情況而言,開乙個vis記錄的陣列,每次進行o(n)的遍歷即可,但是在這一題中,由於在bfs內需要多次遍歷可用陣列,我們選擇用鍊錶來記錄所有可用的點,當他們被分配到乙個聯通塊裡的時候,入隊打標記以及在鍊錶中刪除這個點即可。

雖然這是乙個稠密圖,但是在這樣的操作下,事實上每條邊的遍歷次數和每個點的遍歷次數都是十分有限的,時間複雜度可以降低到o(n + m),通過一些細節操作(對vis標記清零的時候不使用memset而是重新遍歷清零,查詢可用點的時候用鍊錶記錄)可以避免佇列中產生o(n)的時間複雜度,最終將題目降低到可以接受的時限。

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

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

#define _for(i, x, y) for(int i=x;i>=y;i--)

#define mem(f, x) memset(f,x,sizeof(f))

#define sca(x) scanf("%d", &x)

#define scl(x) scanf("%lld",&x);

#define pri(x) printf("%d\n", x)

#define prl(x) printf("%lld\n",x);

#define clr(u) for(int i=0;i<=n;i++)u[i].clear();

#define ll long long

#define ull unsigned long long

#define mp make_pair

#define pii pair#define pil pair#define pll pair#define pb push_back

#define fi first

#define se second typedef vector

vi;const

double eps = 1e-9

;const

int maxn = 2e5 + 10

;const

int inf = 0x3f3f3f3f

;const

int mod = 1e9 + 7

; int

n,m,tmp,k;

bool

vis[maxn],vis2[maxn];

inthead[maxn],tot,pre[maxn],nxt[maxn];

struct

edgeedge[maxn * 2

];void

init()

vi ans;

void del(int

x)void add(int u,int

v)int

bfs()

}for(int i = head[u];i;i = edge[i].next) vis[edge[i].to] = 0

; }

ans.pb(cnt);

}}int

main()

nxt[n] = 0

; for(i,

1,n)

bfs();

sort(ans.begin(),ans.end());

pri(ans.size());

for(int i = 0 ; i < ans.size(); i ++)

#ifdef vscode

system(

"pause");

#endif

return0;

}

Codeforces 976E 題解報告

1 當把所有的倍數2 a都加到同一health上,health增加的最多 2 先計算每乙個creature的hp dmg,按該值對所有的creature排序 再求和,i include using namespace std const int n 200 1000 9 int hp n dmg n...

codeforces 1030E 暴力 思維)

題目 題意 給定一些數,可將區間 l r 中某些數的二進位制位的1的位置更換,使得最終區間所有數異或和為0,求這樣的區間個數。思路 在那裡瞎dp了好久,wa的很徹底,借鑑了一下別人的思路。區間合法的條件是 這個區間1的個數為偶數,並且區間中二進位制位1最多的乙個數的二進位制個數小於等於和的一半。我們...

Codeforces 1270E 構造 數學

有 n 個二維平面上的點,每兩個點之間連一條線段,將這些點劃分為兩個非空的集合 a b 同乙個集合內的兩點之間線段用黃色標註,不同集合的兩點之間線段用藍色標註,使距離相同的線段顏色相同。先將所有點的座標以其中乙個點作為原點轉化一下,使其中必定有乙個點是 0,0 然後將所有點按奇偶分為四組 0代表偶數...