main algorithm:
scan from left to right and right to left to make sure it can save water
code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 1000010;
int a[MAXN], b[MAXN];
int n, h[MAXN];
int main() {
int t;
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
for(int i=1; i<=n; i++) scanf("%d", &a[i]);
for(int i=1; i<=n; i++) scanf("%d", &b[i]);
a[0] = b[0] = INF;
a[n+1] = b[n+1] = INF;
int ah = INF;
for(int i=1; i<=n; i++) {
if(a[i-1] > ah) ah = a[i-1];
if(a[i] > ah) ah = a[i];
if(b[i] < ah) ah = b[i];
h[i] = ah;
}
ah = INF;
for(int i=n; i>=1; i--) {
if(a[i+1] > ah) ah = a[i+1];
if(a[i] > ah) ah = a[i];
if(b[i] < ah) ah = b[i];
if(ah < h[i]) h[i] = ah;
ah = h[i];
}
int ans = 0;
for(int i=1; i<=n; i++)
ans += h[i]-a[i];
printf("%d\n", ans);
}
return 0;
}