「CF618F」Double Knapsack 题解

只能说。。。

1|0Description

给你两个可重集 A,BA,B 的元素个数都为 n,它们中每个元素的大小 x[1,n]。请你分别找出 A,B 的子集,使得它们中的元素之和相等。n106

2|0Solution

将找子集强化成找子段(不知道怎么想的),令 san 表示 A 的前缀和,sbn 表示 B 的前缀和,即找到点对 (x1,y1),(x2,y2),使得 sax1sax2=sby1sby2
我们让 sansbn,则对于每个 sai,都可以找到一个 sbjsai,sbjsai[0,n)。又因为 in+1 种取值,则一定存在一组 (i,j)sbjsai 重复,即得上述点对。

3|0Code

#include <bits/stdc++.h> using namespace std; using ci = const int; using u32 = uint32_t; using i64 = int64_t; using u64 = uint64_t; template<class T> inline void Max(T &x, const T &y) { if (x < y) x = y; } template<class T> inline void Min(T &x, const T &y) { if (y < x) x = y; } using pii = pair<int, int>; const int N = 1e6 + 5; int n, a[N], b[N]; bool vis[N]; pii tong[N]; i64 sa[N], sb[N]; void op(int l, int r) { cout << r - l + 1 << endl; for (int i = l; i <= r; ++i) cout << i << " "; cout << endl; } void output(int al, int ar, int bl, int br) { op(al, ar); op(bl, br); } void solve1() { int tp = 0; for (int i = 0, v; i <= n; ++i) { while (sb[tp] < sa[i]) ++tp; v = sb[tp] - sa[i]; if (vis[v]) return output(tong[v].first + 1, i, tong[v].second + 1, tp); vis[v] = 1, tong[v] = { i, tp }; } } void solve2() { int tp = 0; for (int i = 0, v; i <= n; ++i) { while (sa[tp] < sb[i]) ++tp; v = sa[tp] - sb[i]; if (vis[v]) return output(tong[v].first + 1, tp, tong[v].second + 1, i); vis[v] = 1, tong[v] = { tp, i }; } } int main() { #ifndef ONLINE_JUDGE freopen(".in", "r", stdin); freopen(".out", "w", stdout); #endif ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); memset(tong, 0xff, sizeof tong); cin >> n; for (int i = 1; i <= n; ++i) cin >> a[i]; for (int i = 1; i <= n; ++i) cin >> b[i]; for (int i = 1; i <= n; ++i) sa[i] = sa[i - 1] + a[i]; for (int i = 1; i <= n; ++i) sb[i] = sb[i - 1] + b[i]; if (sa[n] < sb[n]) solve1(); else solve2(); return 0; }

__EOF__

本文作者TrueFalse
本文链接https://www.cnblogs.com/cqbzljh/p/18685463.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   cqbzljh  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2024-01-22 Johnson 全源最短路算法
点击右上角即可分享
微信分享提示