CF 976F 遞增容量最大流

2022-07-16 04:09:15 字數 1891 閱讀 9676

給你乙個二分圖 要求你求出對於k=[0~mindegree] 每個點的度數至少為k所需要的最少邊數 並輸出方案

如果是單個詢問的話 直接跑乙個下界網路流即可 但是有多個詢問 重建圖強行跑不行

反過來考慮,變成至多能刪除多少邊則建邊[s,i,degree[i]-mindegree] [i,t,degree[i]-mindegree] [u,v,1]

這樣跑出來的流 二分圖中沒有流量的邊代表是要選的 有流量的是要刪的 同時保證了每個點的度數不小於mindegree

則接下來每次對與s,t相連的邊容量++ 得到k=[0~mindegree-1]的答案

#includeusing

namespace

std;

const

int maxn = 4050

;const

int maxm = 10005

;const

int inf = 1000000050

;int head[maxn], cur[maxn], lev[maxn], to[maxm << 1], nxt[maxm << 1], f[maxm << 1], ed = 1

, s, t;

inline

void addedge(int u, int v, int

cap)

inline

bool

bfs()

magic one way optimize

*/}}

memcpy(cur, head,

sizeof

head);

return lev[t] != -1;}

inline

int dfs(int u, int

maxf)

int cnt = 0

;

for (int &i = cur[u], tem; i; i =nxt[i])

if (f[i] && lev[to[i]] == lev[u] + 1

) }

if (!cnt)

return

cnt;

}int

dinic()

return

ans;

}void init(int ss, int

tt)int du[4005

];int ans[4005][4005

];int

main()

int mindegree =int_max;

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

s = 0, t = n + 1

;

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

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

int ansnow =dinic();

for (int x = 1; x <= n1; x++) }}

}for (int i = head[s]; i; i =nxt[i])

for (int x = n1 + 1; x <= n; x++) }}

for (int i = mindegree - 1; i >= 0; i--) }}

}for (int j = head[s]; j; j =nxt[j])

for (int x = n1 + 1; x <= n; x++) }}

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

puts(

"");

}return0;

}

view code

解題報告 CF622F

懶得碼字了 很簡單的數論題,紫題顯然是過了些,不要說.對於這個式子,是乙個 k 1 次的多項式,插 k 2 次值就好了,煩人的是處理逆元,我的費馬小定理顯然是 o logp 的,可以用拓歐,聽說還有 o k 的演算法,我似乎感覺不太可能 我太弱了 預處理處階乘,前 字尾積陣列即可,複雜度 o klo...

CF1475F 異常矩陣

原題鏈結 有兩個 0 1 矩陣 a,b,存在兩種操作 1 選擇一列,將這列的元素 xor 1。2 選擇一行,將這行的元素 xor 1。判斷是否存在操作使得矩陣 a 能轉化為矩陣 b。由異或的性質,我們可以得到兩點結論。1 操作的順序不影響結果。2 操作最多只能進行一次。根據這兩點,我們可以根據第一行...

F 最長遞增子串行

給出長度為n的陣列,找出這個陣列的最長遞增子串行。遞增子串行是指,子串行的元素是遞增的 例如 5 1 6 8 2 4 5 10,最長遞增子串行是1 2 4 5 10。input 第1行 1個數n,n為序列的長度 2 n 50000 第2 n 1行 每行1個數,對應序列的元素 10 9 si 10 9...