从左往右扫描一遍, 得从每个位置往右伸长不会碰到天花板的高度, 右往左一样, 取最小, 然后就是可以放“水”的高度了
#include#include #define REP(i, a, b) for(int i = (a); i < (b); i++)using namespace std;const int MAXN = 1123456;int p[MAXN], s[MAXN], h[MAXN], n; int main(){ int T; scanf("%d", &T); while(T--) { scanf("%d", &n); REP(i, 0, n) scanf("%d", &p[i]); REP(i, 0, n) scanf("%d", &s[i]); int level = s[0]; REP(i, 0, n) { if(p[i] > level) level = p[i]; if(s[i] < level) level = s[i]; h[i] = level; } int ans = 0; level = s[n-1]; for(int i = n - 1; i >= 0; i--) { if(p[i] > level) level = p[i]; if(s[i] < level) level = s[i]; ans += min(level, h[i]) - p[i]; } printf("%d\n", ans); } return 0;}