題意:求乙個圖的補圖的連通分量個數以及每個連通分量裡的點個數
如果這不是乙個補圖,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代表偶數...