CF1787H Codeforces Scoreboard
1.P5327 [ZJOI2019] 语言2.2024/04/05 多校集训B层-省选模拟53.2024/04/09 多校集训B层-省选模拟74.2024/04/13 多校集训B层-省选模拟85.2024/04/13 多校集训B层-NOIP模拟16.2024/04/15 多校集训B层-NOIP模拟37.UVA1316 Supermarket
8.CF1787H Codeforces Scoreboard
9.CF1463F Max Correct Set10.P2481 [SDOI2010] 代码拍卖会11.考试题解12.P5336 [THUSC2016] 成绩单13.[AGC035D] Add and Remove14.牛逼题15.String 做题记录16.树套树做题记录17.Atcoder 记录18.数论做题记录19.考试题解(题解纯享版)20.图论做题记录21.DS做题记录CF1787H Codeforces Scoreboard
校内测试的一道题, 考试时根本没动。。
题面
考虑
设计状态
设
时间复杂度
这里先人类智慧的感受一下,
因为要一个一个取min, 所以我们预估的优化就是, 可以通过神奇方法, 批量处理, 也就是在某个区间我们清楚的知道谁大谁小。 那么就考虑这个函数有什么性质, 下凸的, 也就是差分数组单增。
所以就有
再仔细观察,
所以我们维护
最后答案就是
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
#define int long long
struct FHQ{
int ch[N][2], val[N], key[N], siz[N], add[N], rt, tot;
#define ls(u) ch[u][0]
#define rs(u) ch[u][1]
void clear() {
for (int i = 1; i <= tot; i++)
ls(i) = rs(i) = val[i] = key[i] = siz[i] = add[i] = rt = 0;
tot = 0;
}
void NewNode(int v) { ++tot; val[tot] = v; siz[tot] = 1; key[tot] = rand(); }
void pushdown(int u) {
if (add[u]) {
if (ls(u)) val[ls(u)] += add[u], add[ls(u)] += add[u];
if (rs(u)) val[rs(u)] += add[u], add[rs(u)] += add[u];
add[u] = 0;
}
}
void pushup(int u) { siz[u] = siz[ls(u)] + siz[rs(u)] + 1; }
void split(int u, int &L, int &R, int lft, int k, int c) {
if (!u) return L = R = 0, void();
pushdown(u);
if (val[u] + c > (lft + siz[ls(u)] + 1) * k)
split(ls(u), L, ls(R = u), lft, k, c);
else split(rs(u), rs(L = u), R, lft + siz[ls(u)] + 1, k, c);
pushup(u);
}
int merge(int L, int R) {
if (!L || !R) return L + R;
pushdown(L); pushdown(R);
if (key[L] > key[R])
return rs(L) = merge(rs(L), R), pushup(L), L;
else
return ls(R) = merge(L, ls(R)), pushup(R), R;
}
int qry(int u) {
if (!u) return 0;
pushdown(u);
return (val[u] < 0 ? val[u] : 0) + qry(ls(u)) + qry(rs(u));
}
}T;
int t, n, sum;
struct dr{
int k, a, b, c;
bool operator < (const dr &x) const {
return k > x.k;
}
}a[N];
signed main() {
// freopen("faded.in", "r", stdin);
// freopen("faded.out", "w", stdout);
srand(time(NULL));
scanf("%lld", &t);
while (t--) {
scanf("%lld", &n);
sum = 0; T.clear();
for (int i = 1; i <= n; i++)
scanf("%lld%lld%lld", &a[i].k, &a[i].b, &a[i].a),
sum += a[i].b, a[i].c = a[i].b - a[i].a;
sort(a + 1, a + 1 + n);
for (int i = 1; i <= n; i++) {
int L, R;
sum -= a[i].c;
T.split(T.rt, L, R, 0, a[i].k, a[i].c);
T.NewNode((T.siz[L] + 1) * a[i].k - a[i].c);
T.val[R] += a[i].k, T.add[R] += a[i].k;
T.rt = T.merge(L, T.merge(T.tot, R));
}
printf("%lld\n", sum - T.qry(T.rt));
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App