3.4k3 分钟

题意是维护一个带删除操作的可持久化并查集,但不会实现,于是看题解考虑离线操作,解决完一个儿子就回溯操作 注意到离线仍需要带删除操作的并查集,所以需要虚根来实现 一开始操作数组开大了N*30爆MLE,后来因为答案要求的是Yes和No,而打的是YES和NO给了几发WA const int N = 1e6 + 86; int fa[N * 2], flag[N], sz[N * 2], tot, n, m, ans[N], dp[N * 2]; vi v[N]; struct NODE { int op, a, b; } e[N]; int find(int
2.4k2 分钟

题意为给定一个二分图,左右点数均为n,并给定左右相连的边,对这些边两端点满足,并且原图左边点的度数 现给定你一些限制条件并要求你选定一些点及其边,使得右边的点全部被覆盖到 状态压缩dp: 设以数组dp[i][j]其中表示二进制下中前位反应左边点的选取情况,后至位表示右边点的覆盖情况,注意判断是否满足的情况,便可不用三维数组来dp vi v[20], m(30); LL dp[20][(1 << 20) - 1], tt, n, b[20]; int main() { ios::sync_with_stdio(false); cin.tie(0);
2.1k2 分钟

考虑到问题 能使最多顾客满意呢 所以我们应以客人为主要限制目标,所以将其放中间,两边各连房间和菜,于是便可转化为最大流问题 建图应注意到客人只要一个,所以对每个客人应建两点,相连的权值为1,左边点与房间相连,右边点与菜相连 const int N = 2e5 + 86; struct egdes { int to, nxt, w; } e[N * 2]; int hd[N * 2], cur[N * 2], tot = 1, st, en; vi lv; void add(int x, int y, int w) { e[
1.7k2 分钟

对于同意午睡的,源点到该点权值为1,该点到源点权值为0. 而对于好朋友,则两点建立双向边,权值均为1 对于多对好朋友冲突,我们贪心地取最少的那一边使得总冲突数最少,对于此即为最小割最大流。 const int N=5e5+86; struct egdes{ int to,nxt,w; }e[N*2];int hd[N*2],cur[N*2],tot=1,st,en; vi lv; void add(int x,int y,int w){ e[++tot]=(egdes){y,hd[x],w};
1.4k1 分钟

最大流问题,建图时注意每排座位有两人 const int N=2e4+86; struct egdes{ int to,nxt,w; }e[N*2];int hd[N*2],cur[N*2],tot=1,st,en; vi lv; void add(int x,int y,int w){ e[++tot]=(egdes){y,hd[x],w}; hd[x]=tot; } int bfs(){ lv.assign(N,0); memcpy(cur