AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

仪仗队

作者: 作者的头像   不知名的fE ,  2025-06-13 11:47:27 · 河北 ,  所有人可见 ,  阅读 3


0


仪仗队

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    static final int N = 500010, INF = 0x3f3f3f3f;
    static Node[] tr = new Node[N * 4];
    static int[] a = new int[N];
    static int n, m;

    public static void main(String[] args) {
        FastReader sc = new FastReader();

        n = sc.nextInt();
        long sum = 0;
        for (int i = 1; i <= n; i++) {
            a[i] = sc.nextInt();
            sum += a[i];
        }
        build(1, 1, n);
        m = sc.nextInt();
        while (m -- > 0) {
            int l = sc.nextInt(), r = sc.nextInt();
            l = find(l);
            r = find(r);
            Pair pp = querymin(1, 1, n, l, r);
            int idx = pp.x;
            sum -= a[idx];
            update(1, 1, n, idx);
        }

        System.out.println(sum);
    }

    static void update(int u, int l, int r, int x) {
        if (l == r) {
            tr[u].sum = 0;
            tr[u].min = INF;
            return;
        }

        int mid = l + r >> 1;
        if (x <= mid) update(u * 2, l, mid, x);
        else update(u * 2 + 1, mid + 1, r, x);
        pushup(u);
    }

    static Pair querymin(int u, int l, int r, int ql, int qr) {
        if (ql <= l && r <= qr) return new Pair(tr[u].idx, tr[u].min);

        int mid = l + r >> 1;
        if (qr <= mid) return querymin(u * 2, l, mid, ql, qr);
        else if (ql > mid) return querymin(u * 2 + 1, mid + 1, r, ql, qr);
        else {
            Pair left = querymin(u * 2, l, mid, ql, qr);
            Pair right = querymin(u * 2 + 1, mid + 1, r, ql, qr);
            if (left.y <= right.y) return left;
            else return right;
        }
    }

    static int querysum(int u, int l, int r, int ql, int qr) {
        if (ql <= l && r <= qr) return tr[u].sum;

        int mid = l + r >> 1;
        if (qr <= mid) return querysum(u * 2, l, mid, ql, qr);
        else if (ql > mid) return querysum(u * 2 + 1, mid + 1, r, ql, qr);
        else return querysum(u * 2, l, mid, ql, qr) + querysum(u * 2 + 1, mid + 1, r, ql, qr);
    }

    static int find(int x) {
        int l = 1, r = n;
        while (l < r) {
            int mid = l + r >> 1;
            if (querysum(1, 1, n, 1, mid) >= x) r = mid;
            else l = mid + 1;
        }

        return r;
    }

    static void build(int u, int l, int r) {
        tr[u] = new Node();
        if (l == r) {
            tr[u].sum = 1;
            tr[u].min = a[l];
            tr[u].idx = l;
            return;
        }

        int mid = l + r >> 1;
        build(u * 2, l, mid);
        build(u * 2 + 1, mid + 1, r);
        pushup(u);
    }

    static void pushup(int u) {
        tr[u].sum = tr[u * 2].sum + tr[u * 2 + 1].sum;
        if (tr[u * 2].min <= tr[u * 2 + 1].min) {
            tr[u].min = tr[u * 2].min;
            tr[u].idx = tr[u * 2].idx;
        } else {
            tr[u].min = tr[u * 2 + 1].min;
            tr[u].idx = tr[u * 2 + 1].idx;
        }
    }

    static class Pair {
        int x, y;

        public Pair(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }

    static class Node {
        int sum;//区间有效值
        int min;//区间最小值
        int idx;//最小值的下标
    }

    static class FastReader {
        BufferedReader br;
        StringTokenizer st;

        public FastReader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        String next() {
            while (st == null || !st.hasMoreTokens()) {
                try {
                    st = new StringTokenizer(br.readLine(), " ");
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            return st.nextToken();
        }

        public int nextInt() {
            return Integer.parseInt(next());
        }

        long nextLong() {
            return Long.parseLong(next());
        }

        double nextDouble() {
            return Double.parseDouble(next());
        }
    }
}

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息