給你乙個二分圖 要求你求出對於k=[0~mindegree] 每個點的度數至少為k所需要的最少邊數 並輸出方案
如果是單個詢問的話 直接跑乙個下界網路流即可 但是有多個詢問 重建圖強行跑不行
反過來考慮,變成至多能刪除多少邊則建邊[s,i,degree[i]-mindegree] [i,t,degree[i]-mindegree] [u,v,1]
這樣跑出來的流 二分圖中沒有流量的邊代表是要選的 有流量的是要刪的 同時保證了每個點的度數不小於mindegree
則接下來每次對與s,t相連的邊容量++ 得到k=[0~mindegree-1]的答案
#includeusingview codenamespace
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;
}
解題報告 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...