[AGC018C] Coins 题解
Description
有
要选出
Solution
先默认每个人都选
注意到如果
所以如果把所有人按照
时间复杂度:
Code
#include <bits/stdc++.h> #define int int64_t const int kMaxN = 1e5 + 5; int n, x, y, z, ans; int a[kMaxN], b[kMaxN], c[kMaxN], pre[kMaxN], suf[kMaxN]; std::vector<std::tuple<int, int, int>> vec; void getpre() { std::multiset<int> st; int sum = 0; for (int i = 1; i <= n; ++i) { int val = std::get<2>(vec[i]); if (st.size() < y) sum += val, st.emplace(val); else if (*st.begin() < val) sum += val - *st.begin(), st.erase(st.begin()), st.emplace(val); if (i >= y) pre[i] = sum; } } void getsuf() { std::multiset<int> st; int sum = 0; for (int i = n; i; --i) { int val = std::get<1>(vec[i]); if (st.size() < x) sum += val, st.emplace(val); else if (*st.begin() < val) sum += val - *st.begin(), st.erase(st.begin()), st.emplace(val); if (i <= n - x + 1) suf[i] = sum; } } void dickdreamer() { std::cin >> x >> y >> z; n = x + y + z; for (int i = 1; i <= n; ++i) { std::cin >> a[i] >> b[i] >> c[i]; ans += c[i], a[i] -= c[i], b[i] -= c[i]; vec.emplace_back(a[i] - b[i], a[i], b[i]); } vec.emplace_back(-2e9, 0, 0); std::sort(vec.begin(), vec.end()); getpre(), getsuf(); int tmp = -1e18; for (int i = y; i <= n - x; ++i) tmp = std::max(tmp, pre[i] + suf[i + 1]); std::cout << ans + tmp << '\n'; } int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; // std::cin >> T; while (T--) dickdreamer(); std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n"; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步