目錄
\(n\) 個結點,有 \(n - 1\) 條邊為樹邊, \(m\) 條邊為非樹邊。減掉乙個樹邊和乙個非樹邊使圖不連通,問方案數。考慮一條非樹邊 \((u, v)\) 的貢獻:資料範圍: \(n \le 1e5, m \le 2e5\)
我們稱每條附加邊 \((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...