社区讨论

求问时间复杂度

题目总版参与者 3已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mkicvfp3
此快照首次捕获于
2026/01/17 21:41
上个月
此快照最后确认于
2026/01/20 21:35
4 周前
查看原帖
ABC F
CPP
#include <bits/stdc++.h>
using namespace std;
pair<long long, pair<bitset<10005>, bitset<10005> > > dp[50005];
long long n, m, p[10005], v[10005], id;
bitset<10005> a, b;
int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) cin >> p[i] >> v[i];
	for (int i = 1; i <= m; ++i)
		dp[i].first = -2e18;
	for (int i = 1; i <= n; ++i)
		for (int j = m; j >= p[i]; --j) {
			dp[j] = dp[j];
			if (dp[j].first == dp[j - p[i]].first + v[i]) {
				dp[j].second.first &= dp[j - p[i]].second.first;
				dp[j].second.second |= dp[j - p[i]].second.second;
				dp[j].second.second[i] = 1;
			} else if (dp[j].first < dp[j - p[i]].first + v[i]) {
				dp[j] = dp[j - p[i]];
				dp[j].first += v[i];
				dp[j].second.first[i] = 1;
				dp[j].second.second[i] = 1;
			}
		}
	for (int i = 1; i <= m; ++i)
		if (dp[id].first < dp[i].first) {
			id = i;
			a = dp[i].second.first;
			b = dp[i].second.second;
		} else if (dp[id].first == dp[i].first) {
			a &= dp[i].second.first;
			b |= dp[i].second.second;
		}
	for (int i = 1; i <= n; ++i)
		if (a[i]) cout << "A";
		else if (b[i]) cout << "B";
		else cout << "C";
//	cout << dp[4][1].second.first << endl << dp[5][1].second.second;
}

回复

7 条回复,欢迎继续交流。

正在加载回复...