否则执行转移。如果
l
p
[
p
]
=
r
p
[
p
]
lp[p]=rp[p]
lp[p]=rp[p] 那么
d
p
[
0
]
[
1
]
=
d
p
[
1
]
[
0
]
=
0
dp[0][1]=dp[1][0]=0
dp[0][1]=dp[1][0]=0 但是
d
p
[
1
]
[
1
]
=
I
N
F
dp[1][1]=INF
dp[1][1]=INF 。
注意线段树的划分方式是唯一确定的。时间复杂度
O
(
2
4
(
n
+
q
)
l
o
g
(
n
+
q
)
)
O(2^4(n+q)log(n+q))
O(24(n+q)log(n+q)) 。
#include<bits/stdc++.h>#define ll long long#define INF 0x3f3f3f3fusingnamespace std;
constint mx = 2e5 + 5;
int n, m, lsh[mx], a[mx], cnt;
structquery {
int op, x;
} q[mx];
structnode {
int dp[2][2], lp, rp, siz;
} t[mx << 2], null;
intgetx(int x){ returnlower_bound(lsh + 1, lsh + 1 + cnt, x) - lsh; }
node meg(node x, node y){
node now;
if (x.siz == 0)
return y;
if (y.siz == 0)
return x;
now.lp = x.lp;
now.rp = y.rp;
now.siz = x.siz + y.siz;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
now.dp[i][j] = INF;
for (int k = 0; k < 2; k++) {
for (int l = 0; l < 2; l++) {
int tmp = x.dp[i][k] + y.dp[l][j];
if (k == 0 || l == 0)
tmp += lsh[y.lp] - lsh[x.rp];
now.dp[i][j] = min(now.dp[i][j], tmp);
}
}
}
}
return now;
}
voidupdate(int p, int l, int r, int x, int val){
if (l == r) {
if (val == 0) {
t[p].lp = t[p].rp = l;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
if (i == 1 && j == 1)
t[p].dp[i][j] = INF;
else t[p].dp[i][j] = 0;
}
}
t[p].siz = 1;
} else {
t[p].lp = t[p].rp = 0;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
t[p].dp[i][j] = 0;
}
}
t[p].siz = 0;
}
return;
}
int mid = l + r >> 1;
if (x <= mid)
update(p << 1, l, mid, x, val);
elseupdate(p << 1 | 1, mid + 1, r, x, val);
t[p] = meg(t[p << 1], t[p << 1 | 1]);
}
intmain(){
int T;
scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &m);
cnt = 0;
for (int i = 1; i <= n; i++) scanf("%d", &a[i]), lsh[++cnt] = a[i];
for (int i = 1; i <= m; i++) {
scanf("%d%d", &q[i].op, &q[i].x);
q[i].op--;
if (q[i].op == 0)
lsh[++cnt] = q[i].x;
}
sort(lsh + 1, lsh + 1 + cnt);
fill(t, t + cnt * 4 + 1, null);
for (int i = 1; i <= n; i++) {
int x = getx(a[i]);
update(1, 1, cnt, x, 0);
}
for (int i = 1; i <= m; i++) {
int x = getx(q[i].x);
update(1, 1, cnt, x, q[i].op);
if (t[1].siz <= 1)
printf("0\n");
elseprintf("%d\n", t[1].dp[1][1]);
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」