Loj題解 10131 暗的連鎖

2022-06-26 08:42:11 字數 1430 閱讀 3648

目錄

\(n\) 個結點,有 \(n - 1\) 條邊為樹邊, \(m\) 條邊為非樹邊。減掉乙個樹邊和乙個非樹邊使圖不連通,問方案數。

資料範圍: \(n \le 1e5, m \le 2e5\)

考慮一條非樹邊 \((u, v)\) 的貢獻:

我們稱每條附加邊 \((u, v)\) 都把樹上 \(u, v\) 間的路徑覆蓋了一次。

顯然,被覆蓋了兩次的邊一定沒有可行方案;

被覆蓋了一次的邊只能有一種方案;

沒有被覆蓋的邊可以選任意一條非樹邊,有 \(m\) 種方案。

所以用樹上差分統計出每條樹邊被覆蓋了幾次,最後列舉一遍求每條邊的貢獻即可

用樹上差分時,假設加一條邊 \((u,v)\)

那麼 \(cnt_u ++, cnt_v++, cnt_ -= 2\)

然後 dfs 回溯統計即可

(自己畫個圖手模一下)

code

/*

work by: suzt_ilymics

knowledge: ??

time: o(??)

*/#include#include#include#include#include#define ll long long

#define orz cout<<"lkp ak ioi!"

const int maxn = 2e5+5;

const int inf = 1e9+7;

const int mod = 1e9+7;

struct edgee[maxn << 1];

int head[maxn], num_edge = 0;

int n, m, ans = 0;

int cnt[maxn], ans[maxn];

int dep[maxn], top[maxn], fath[maxn], siz[maxn], son[maxn];

int read()

void add_edge(int from, int to) , head[from] = num_edge; }

void dfs(int u, int fa)

}void dfs2(int u, int tp)

}int get_lca(int u, int v)

void dfs(int u, int fa)

}int main()

dfs(1, 0), dfs2(1, 1);

for(int i = 1, u, v; i <= m; ++i)

dfs(1, 0);

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

printf("%d", ans);

return 0;

}

題解 LOJ540遊戲

小l計畫進行n場遊戲,每場遊戲使用一張地圖,小 l 會同時使用三輛車在該地圖上完成遊戲。小 l 的賽車有三輛,分別用大寫字母 a b c 表示。地圖是一張無向簡單圖 沒有重邊或自環 每次他會在地圖中選擇不同的三個點 i,j,k滿足 i且兩兩之間均有邊。此時他會讓 a 從i到j,b 從j到k,c從k到...

題解 Loj2727舞會

n 個數,其中有 m 個位置的數是確定的,另外的數隨意排列。每次操作把最前面三個數取出,把它們的中位數取出來放到最後,然後刪掉這三個數。通過合適的排列,使最後留下來的數最大。首先這類有關中位數的問題,可以二分後轉化為操作 01 序列的問題。每次二分乙個有可能的答案 mid 把 mid 換成一,的數換...

loj6274 數字 題解

ppt 首先考慮樸素做法。我們列舉 v 檢查是否能存在 x 和 y 滿足 x land y v 設dp狀態 f i,0 1,0 1,0 1,0 1 表示當前考慮了前 i 位,是否存在一組 x 和 y 滿足 x land y v x lor y t lx leq x leq rx ly leq y l...