是不是卡Java了
查看原帖
是不是卡Java了
993680
congege楼主2024/5/19 14:08

40 分

import java.io.PrintWriter;
import java.util.Scanner;

/**
 * @Author congge
 * @Date 2024/5/19 11:41
 * @description https://www.luogu.com.cn/problem/T439264?contestId=170180
 */
public class Main {
    static Scanner sc = new Scanner(System.in);
//    static FastReader sc = new FastReader();
    static PrintWriter out = new PrintWriter(System.out);
    static int N = 100010;
    static long[] maxA = new long[N << 2], minA = new long[N << 2];
    static long[] maxB = new long[N << 2], minB = new long[N << 2];
    static long[] sum = new long[N << 2];
    static long[] add = new long[N << 2];
    static int[] A = new int[N];
    static int[] B = new int[N];
    static int n, m;

    public static void main(String[] args) {
        n = sc.nextInt();
        m = sc.nextInt();
        for (int i = 1; i <= n; i++) A[i] = sc.nextInt();
        for (int i = 1; i <= n; i++) B[i] = sc.nextInt();
        build(1, 1, n);
        int op, l, r, k, t, i, x, y;
        while (m-- > 0) {
            op = sc.nextInt();
            if (op == 1) {
                l = sc.nextInt();
                r = sc.nextInt();
                k = sc.nextInt();
                t = sc.nextInt();
                if (t == 0) continue;
                modify1(1, 1, n, l, r, k, t);
            } else if (op == 2) {
                i = sc.nextInt();
                x = sc.nextInt();
                y = sc.nextInt();
                modify2(1, 1, n, i, x, y);
            } else {
                l = sc.nextInt();
                r = sc.nextInt();
                out.println(query(1, 1, n, l, r));
            }
        }
        out.flush();
    }

    static void build(int u, int l, int r) {
        if (l == r) {
            maxA[u] = minA[u] = A[l];
            maxB[u] = minB[u] = B[l];
            sum[u] = A[l] + B[l];
            return;
        }
        int mid = l + r >> 1;
        build(u << 1, l, mid);
        build(u << 1 | 1, mid + 1, r);
        pushUp(u);
    }

    static void pushUp(int u) {
        sum[u] = sum[u << 1] + sum[u << 1 | 1];
        maxA[u] = Math.max(maxA[u << 1], maxA[u << 1 | 1]);
        minA[u] = Math.min(minA[u << 1], minA[u << 1 | 1]);
        maxB[u] = Math.max(maxB[u << 1], maxB[u << 1 | 1]);
        minB[u] = Math.min(minB[u << 1], minB[u << 1 | 1]);
    }

    static void modify1(int u, int l, int r, int ql, int qr, int k, int t) {
        if (minA[u] * minB[u] > k) return;
        if (l == ql && r == qr && maxA[u] * maxB[u] <= k) {
            pushDown(u, l, r, t);
            return;
        }
        pushDown(u, l, r);
        int mid = l + r >> 1;
        if (qr <= mid) modify1(u << 1, l, mid, ql, qr, k, t);
        else if (ql > mid) modify1(u << 1 | 1, mid + 1, r, ql, qr, k, t);
        else {
            modify1(u << 1, l, mid, ql, mid, k, t);
            modify1(u << 1 | 1, mid + 1, r, mid + 1, qr, k, t);
        }
        pushUp(u);
    }

    static void modify2(int u, int l, int r, int i, int x, int y) {
        if (l == r) {
            maxA[u] = minA[u] = x;
            maxB[u] = minB[u] = y;
            sum[u] = x + y;
            return;
        }
        pushDown(u, l, r);
        int mid = l + r >> 1;
        if (i <= mid) modify2(u << 1, l, mid, i, x, y);
        else modify2(u << 1 | 1, mid + 1, r, i, x, y);
        pushUp(u);
    }

    static long query(int u, int l, int r, int ql, int qr) {
        if (l == ql && r == qr) {
            return sum[u];
        }
        pushDown(u, l, r);
        int mid = l + r >> 1;
        if (qr <= mid) return query(u << 1, l, mid, ql, qr);
        else if (ql > mid) return query(u << 1 | 1, mid + 1, r, ql, qr);
        return query(u << 1, l, mid, ql, mid) + query(u << 1 | 1, mid + 1, r, mid + 1, qr);
    }

    static void pushDown(int u, int l, int r) {
        if (add[u] > 0) {
            int mid = l + r >> 1;
            pushDown(u << 1, l, mid, add[u]);
            pushDown(u << 1 | 1, mid + 1, r, add[u]);
            add[u] = 0;
        }
    }

    static void pushDown(int u, int l, int r, long t) {
        sum[u] = sum[u] + 2L * (r - l + 1) * t;
        maxA[u] += t;
        minA[u] += t;
        maxB[u] += t;
        minB[u] += t;
        add[u] += t;
    }
}
//
//class FastReader {
//    StringTokenizer st;
//    BufferedReader br;
//
//    FastReader() {
//        br = new BufferedReader(new InputStreamReader(System.in));
//    }
//
//    String next() {
//        while (st == null || !st.hasMoreElements()) {
//            try {
//                st = new StringTokenizer(br.readLine());
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//        return st.nextToken();
//    }
//
//    int nextInt() {
//        return Integer.parseInt(next());
//    }
//
//    String nextLine() {
//        String s = "";
//        try {
//            s = br.readLine();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return s;
//    }
//
//    long nextLong() {
//        return Long.parseLong(next());
//    }
//
//    double nextDouble() {
//        return Double.parseDouble(next());
//    }
//
//    // 是否由下一个
//    boolean hasNext() {
//        while (st == null || !st.hasMoreTokens()) {
//            try {
//                String line = br.readLine();
//                if (line == null)
//                    return false;
//                st = new StringTokenizer(line);
//            } catch (IOException e) {
//                throw new RuntimeException(e);
//            }
//        }
//        return true;
//    }
//}
2024/5/19 14:08
加载中...