题意

思路
求出aia_iai表示还需多少才能转换成bib_ibi,把它差分。
如果加的数不超过444,那么答案就为∑i=1nmax(0,ai)\sum_{i=1}^{n}max(0,a_i)∑i=1nmax(0,ai)。
否则如果让区间(l,r](l,r](l,r]加上4,即al−4,ar+4a_l-4,a_r+4al−4,ar+4,那么就要使ar+4<ala_r+4<a_lar+4<al,分类讨论。
代码
#include<cstdio>
int t, n, ans;
int a[100002];
int main() {
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
int x;
for (int i = 1; i <= n; i++) {
scanf("%d", &x);
a[i] = (x - a[i] + 4) % 4;
}
ans = 0;
for (int i = 1; i <= n; i++) {
a[i] -= a[i + 1];
if (a[i] > 0) ans += a[i];
}
int t2 = 0, t3 = 0;
for (int i = 1; i <= n; i++) {
if (a[i] == -3) {
if (t3) {
t3--;
ans -= 2;
} else if (t2) {
t2--;
ans--;
}
}
else if (a[i] == -2) {
if (t3) {
t3--;
t2++;
ans--;
}
}
else {
t2 += a[i] == 2;
t3 += a[i] == 3;
}
}
printf("%d\n", ans);
}
}
博客围绕一道题展开,先阐述题意,接着给出思路。需计算ai表示转换成bi还需的量并进行差分,根据加的数是否超过4分类讨论,若不超4,答案为∑i=1nmax(0,ai);若超4,让区间(l,r]加4,要使ar+4<al。最后给出代码。
951

被折叠的 条评论
为什么被折叠?



