CF1334F Strange Function 题解
定义一个函数
给定长度
转化问题,变成保留一些数最大代价是多少。
注意到
一个简单的思路是
设
写出转移方程:
直接硬来是
令
于是引入一个
因为
在
对于旧
对于新增的
那么
当我们询问
所以
直接线段树当然可以,但是有些大材小用了。单点
注意在
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e5 + 5;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
int n, a[N], m, b[N];
ll p[N], sum, f[N];
struct BIT {
ll c[N];
int lowbit(int x) {
return x & -x;
}
void mdf(int x, ll v) {
for (; x <= n; x += lowbit(x))
c[x] += v;
}
ll qry(int x) {
ll s = 0;
for (; x; x -= lowbit(x))
s += c[x];
return s;
}
} T;
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++) {
cin >> p[i];
sum += p[i];
}
cin >> m;
for (int i = 1; i <= m; i++)
cin >> b[i];
T.mdf(1, -INF);
for (int i = 1; i <= n; ++i) {
int j = lower_bound(b + 1, b + 1 + m, a[i]) - b;
if (j <= m && a[i] == b[j]) { //是b数组内的
if (j == 1)
f[i] = p[i];
else
f[i] = T.qry(b[j - 1]) + p[i];
}
else
f[i] = ~INF;
if (p[i] > 0)
T.mdf(a[i], p[i]);
ll tmp = T.qry(a[i]);
if (f[i] > tmp) {
T.mdf(a[i], f[i] - tmp);
T.mdf(a[i] + 1, tmp - f[i]);
}
}
ll ans = T.qry(b[m]);
if (ans > -1e15) {
puts("YES");
cout << sum - ans << endl;
}
else
puts("NO");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!