

투 포인터를 활용한 문제.
배열 와 배열 에서 나올 수 있는 모든 수열의 합을 누적합 리스트에 넣어두자.
누적합 리스트 , 를 정렬하고 에서 에서 탐색을 시작한다.
해당 두 포인트의 값을 더한 경우 나오는 값은 3개이다.
임의의 합 이 보다 작은 경우
임의의 합 이 보다 큰 경우
임의의 합 이 와 동일한 경우
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
    static int T, N, M;
    static int[] A, B;
    static List<Long> AList, BList;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        T = Integer.parseInt(br.readLine());
        N = Integer.parseInt(br.readLine());
        A = new int[N];
        StringTokenizer stk = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            A[i] = Integer.parseInt(stk.nextToken());
        }
        M = Integer.parseInt(br.readLine());
        B = new int[M];
        stk = new StringTokenizer(br.readLine());
        for (int i = 0; i < M; i++) {
            B[i] = Integer.parseInt(stk.nextToken());
        }
        AList = new ArrayList<>();
        for (int i = 0; i < A.length; i++) {
            long tmp = 0;
            for (int j = i; j < A.length; j++) {
                tmp += A[j];
                AList.add(tmp);
            }
        }
        BList = new ArrayList<>();
        for (int i = 0; i < B.length; i++) {
            long tmp = 0;
            for (int j = i; j < B.length; j++) {
                tmp += B[j];
                BList.add(tmp);
            }
        }
        Collections.sort(AList);
        Collections.sort(BList);
        int Apoint = 0;
        int Bpoint = BList.size() - 1;
        long ans = 0;
        while (Bpoint >= 0 && Apoint < AList.size()) {
            long sum = AList.get(Apoint) + BList.get(Bpoint);
            if (sum < T) {
                int curr = Apoint;
                while (Apoint < AList.size() && AList.get(Apoint) <= AList.get(curr)) Apoint++;
            } else if (sum > T) {
                int curr = Bpoint;
                while (Bpoint >=0 && BList.get(Bpoint) >= BList.get(curr)) Bpoint--;
            } else {
                int currA = Apoint;
                int currB = Bpoint;
                long cntA = 0;
                long cntB = 0;
                while (Apoint < AList.size() && AList.get(Apoint) <= AList.get(currA)) {
                    Apoint++;
                    cntA++;
                }
                while (Bpoint >=0 && BList.get(Bpoint) >= BList.get(currB)) {
                    Bpoint--;
                    cntB++;
                }
                ans += cntA * cntB;
            }
        }
        System.out.println(ans);
    }
}