1 条题解
-
0
自动搬运
来自洛谷,原作者为

Lgx_Q
变强不如变菜搬运于
2025-08-24 23:09:40,当前版本为作者最后更新于2025-06-30 20:16:27,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
设 共 组, 共 组。
设 为三种数字的出现次数,那么一个显然的条件为 。
观察匹配的性质,发现 选取的一定是最前面的 个 和最后面的 个 ,具体的,会让第 个 和第 个 匹配,第 个 和第 个 匹配等等。 同理。
那么我们容易扫描求出 的上界 和 的上界 。
这并不充分。现在给每对匹配分配一个 ,相当于有 个区间,每个区间匹配一个位于区间内的 。
我们先求出最大的 ,最后再构造方案。
使用 Hall 定理,相当于对于每个区间 ,被 包含的匹配区间数量不超过 中 的个数。
枚举 ,我们根据区间内第一个 和最后一个 的标号(标号指这个 是原序列中的第几个 ),容易求出 和 ,表示当 时 内出现第一组 ,当 时 内出现第一组 。
那么我们通过观察可以得出区间内 的组数为 , 同理。
求出 表示 内 的个数,条件可以写作 。
可以拆成 ,, 三个条件。记一个 表示 的上界,那么用这三个值分别更新 即可。
得到一组 最大的 之后,扫描一遍原序列,用一个 set 求出每个区间应该匹配哪个 。时间复杂度 。
代码中变量名会有所差异。
ll n, a[maxn], b[maxn], m[4], ulim, vlim, slim, u, v; set <ll> st; vector <ll> vec[4]; void maximize(vector <ll> A) { n = A.size(); for(ll i = 0; i < n; i++) a[i + 1] = A[i]; vec[1].pb(0), vec[2].pb(0), vec[3].pb(0); for(ll i = 1; i <= n; i++) b[i] = ++m[a[i]], vec[a[i]].pb(i); ulim = vlim = slim = min(min(m[1], m[3]), m[2]); for(ll i = 1, lst1 = 0, lst3 = 0; i <= n; i++) if(a[i] == 1) { if(lst3) chkmin(ulim, b[i] + m[3] - lst3 - 1); lst1 = b[i]; } else if(a[i] == 3) { if(lst1) chkmin(vlim, b[i] + m[1] - lst1 - 1); lst3 = b[i]; } for(ll l = 1; l <= n; l++) { ll cnt = 0, fir1 = 0, fir3 = 0, lst1 = 0, lst3 = 0; for(ll r = l; r <= n; r++) { if(a[r] == 2) ++cnt; else if(a[r] == 1) { fir1 || (fir1 = b[r]); lst1 = b[r]; } else { fir3 || (fir3 = b[r]); lst3 = b[r]; } if(!fir1 || !fir3) continue; ll u0 = fir1 + m[3] - lst3 - 1, v0 = fir3 + m[1] - lst1 - 1; chkmin(ulim, u0 + cnt), chkmin(vlim, v0 + cnt); chkmin(slim, u0 + v0 + cnt); } } u = min(ulim, slim), v = min(vlim, slim - u); for(ll i = 1; i <= n; i++) { if(a[i] == 2) st.insert(i); else if(a[i] == 1) { if(m[1] - b[i] + 1 <= v) { auto it = st.lower_bound(vec[3][b[i] - m[1] + v]); answer(vec[3][b[i] - m[1] + v] - 1, *it - 1, i - 1); st.erase(it); } } else { if(m[3] - b[i] + 1 <= u) { auto it = st.lower_bound(vec[1][b[i] - m[3] + u]); answer(vec[1][b[i] - m[3] + u] - 1, *it - 1, i - 1); st.erase(it); } } } }
- 1
信息
- ID
- 11373
- 时间
- 3000ms
- 内存
- 1024MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者