「Gym - 100886A」Three Servers

news/2025/3/18 9:22:31/文章来源:https://www.cnblogs.com/nullpt3/p/18778242

给个不动脑子的做法。

考虑设 \(f_{i,j,k}\) 为考虑前 \(i\) 个数时,是否存在一种方案,满足两组权值为 \(j,k\)

考虑转移 \(f_{i,j,k} \to f_{i+1,j,k},f_{i+1,j+x,k},f_{i+1,j,k+x}\),其中 \(x\) 代表第 \(a_i\)

这样的有效状态是 \(O(n^3t^2)\) 的,单次转移是 \(O(1)\) 的。

01 串,考虑 bitset 优化,优化后复杂度为 \(O(\dfrac{n^3t^2}{w})\)

这个时候已经可以在给定时间内通过了,但是空间算一下会发现被卡了四倍左右。

滚动数组不太可行,应为要给出方案。

考虑先求出答案,给出方案的时候,分成四个区间 \([1,x_1],[x_1+1,x_2],[x_2+1,x_3],[x_3+1,n]\),每次跑 \([1,x_i]\) 的 dp,但是只保留 \([x_{i-1}+1,x_i]\) 区间的 bitset。

这样分四次统计方案可以减少一个四倍的常数,另外容易被卡时间,稍微写精细点足以通过。

#include <bits/stdc++.h>
#define ll long long
#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define pii pair<ll, ll>
#define mp make_pair
#define pb push_back
#define ld lower_bound
#define rep(i, a, b) for (int i = (a); i <= (b); i++)
#define drep(i, a, b) for (int i = (a); i >= (b); i--)
#define ud upper_bound
#define mem(s, k) memset(s, k, sizeof(s))
#define fi first
#define se second
#define ull unsigned long long
#define vec vector <int>
#define fv inline void
#define fn inline static
using u16 = unsigned short; using u32 = unsigned; using u64 = unsigned ll; using u128 = __uint128_t;
using i16 = short; using i32 = ll; using i64 = ll; using i128 = __int128_t;
using namespace std;
const i32 N = 5e2, M = N / 4, V = 4e3;
bitset <V + 5> S[M][V + 5], cl;
i32 n, sum, ans = 1e9, w[N], to[N], op[N], cnt[10];
fn i32 calc(i32 a, i32 b) {return max({a, b, sum - a - b}) - min({a, b, sum - a - b});
}
fv sol(i32 r) {rep (i, 0, M - 1) rep (j, 0, V) S[i][j] = cl;S[to[0] ? to[0] : 0][0] = 1;rep (i, 1, r) {i32 now = (i & 1), lst = (i - 1) & 1;if (to[i]) now = to[i];if (to[i - 1]) lst = to[i - 1];rep (j, 0, V) S[now][j] = cl;rep (j, 0, V) S[now][j] |= S[lst][j];rep (j, w[i], V) S[now][j] |= S[lst][j - w[i]];rep (j, 0, V) S[now][j] |= (S[lst][j] << w[i]);}
}
fn pii find(i32 l, i32 r, i32 a, i32 b, bool opt) {
//  cout << l << " " << r << " - " << a << " " << b << "\n"; if (opt) {memset(to, 0, sizeof(to));rep (i, l - 1, r) to[i] = i - l + 3;sol(r);}drep (i, r, l) {if (S[to[i - 1]][a][b]) op[i] = 3, cnt[3]++;else if (b >= w[i] && S[to[i - 1]][a][b - w[i]]) b -= w[i], op[i] = 2, cnt[2]++;else op[i] = 1, cnt[1]++, a -= w[i];}return mp(a, b);
}
int main() {cin >> n;rep (i, 1, n) cin >> w[i], sum += w[i];i32 mid1 = n / 4, mid2 = n / 4 * 2, mid3 = n / 4 * 3;rep (i, mid3, n) to[i] = i - mid3 + 3;sol(n);rep (a, 0, V) {rep (b, 0, V) {if (S[to[n]][a][b]) ans = min(ans, calc(a, b));}}cout << ans << "\n";rep (a, 0, V) {rep (b, 0, V) {if (!S[to[n]][a][b]) continue;if (calc(a, b) == ans) {pii s = find(mid3 + 1, n, a, b, 0);s = find(mid2 + 1, mid3, s.fi, s.se, 1);s = find(mid1 + 1, mid2, s.fi, s.se, 1);find(1, mid1, s.fi, s.se, 1);rep (u, 1, 3) {cout << cnt[u] << " ";rep (i, 1, n) if (op[i] == u) cout << i << " ";cout << "\n";}return 0;}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/900789.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录一个蓝桥杯串口2的问题

去年整串口的时候也是用的定时器2来当波特率发生器,但是死活不能用,所以去年是用定时器1来当波特率发生器,所以后面国赛的时候吃屎了。 今天在练习第十届决赛的时候又遇到了这个问题,由于用的是新模板,所以以为是模板里sprintf的问题,但经过排查不是。经过很久的排查发现…

在线记事本 | AI 设计

AI 设计在线记事本,可以临时使用。前情概要 以前用过的在线记事本,都是将对应的网址嵌入本博客中来使用,20250318,心血来潮给 DeepSeek 指令发送指令,“给我设计一套在线记事本的代码,要求能嵌入博客中,HTML,CSS,JS”,就这样简单的一句话,不到 2 分钟,一套完整的网页…

邮箱服务 ---nodemailer 、js-yaml

使用nodejs 发送邮件需要用到两个库npm install js-yaml npm install nodemailer YAML(YAML Aint Markup Language)是一种人类可读的数据序列化格式,用于表示数据结构。它通常用于配置文件、数据交换和设置等场景。 主要特点:简洁易读:YAML 使用缩进表示层级关系,不需要…

从常见问题到核心需求,探讨文件同步软件哪个好用?

在企业日常运营中,文件同步是一项至关重要的任务,尤其是在多服务器、多分支机构或分布式系统中。选择合适的文件同步软件不仅能提高工作效率,还能确保数据的安全性和一致性。文件同步软件哪个好用,本文将探讨如何选择高效可靠的文件同步软件,并推荐一款值得信赖的解决方案…

130道基础OJ编程题之: 89~107

130道基础OJ编程题之: 89~107 @目录130道基础OJ编程题之: 89~10789. BC101 班级成绩输入输出99. BC102 矩阵元素定位100. BC103 序列重组矩阵101. BC104 最高身高102. BC105 矩阵相等判定103. BC106 上三角矩阵判定104. BC107 矩阵转置105. BC108 矩阵交换106. BC109 杨辉三角1…

【2025年企业必看】跨网文件传输难题如何破解?适合IT运维的解决方案

一、哪些行业会面临跨网文件传输场景 跨网文件传输的需求广泛存在于多个行业和企业机构中,以下是一些典型的行业和机构: 1、金融行业 银行:内部不同网域和部门之间、不同分支机构之间需要共享客户数据、交易记录等。 保险公司:总部与各地分公司之间需要传输保单、理赔数据等…

20250318

1. 20号胶 准备迎来建仓机会

UML之泛化用例

UML用例可以泛化,泛化可简化模型、避免重复、易于扩展。通过抽象用例实现复用和模块化。讨论参与者及用例之间的泛化关系,指出不使用泛化可能导致模型复杂和重复工作的问题。在UML中,参与者和用例都可以被泛化或特化,它们在泛化或特化时遵循面向对象中泛化与特化的特性。 用…

01. Linux系统编程入门

入门系统编程,首先理解一下基本的系统调用和库函数的区别 一切皆文件的思想,都是通过文件描述符来进行操作 strace命令文件读写系统调用 #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int main (void) {in…

Macbook pro 打开pgAmin报错

当我们安装完postgresql,打开自带的pgAdmin时会报如下错误,这时候我需要去单独下载一个版本pgAdmin重新安装 下载地址:https://www.pgadmin.org/download/pgadmin-4-macos/

读DAMA数据管理知识体系指南23数据集成概念(上)

读DAMA数据管理知识体系指南23数据集成概念(上)1. 数据集成和互操作 1.1. 数据集成和互操作(DII)描述了数据在不同数据存储、应用程序和组织这三者内部和之间进行移动和整合的相关过程 1.2. 数据集成是将数据整合成物理的或虚拟的一致格式 1.3. 数据互操作是多个系统之间进行…