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

第几小

作者: 作者的头像   不知名的fE ,  2025-06-12 19:05:46 · 河北 ,  所有人可见 ,  阅读 4


0


第几小

单点修改

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

public class Main {
    static final int N = 100010;
    static final int L = (int) Math.sqrt(N + 1);
    static final int M = N / L + 10;
    static int[] bl = new int[M], br = new int[M], gid = new int[N], a = new int[N];
    static ArrayList<Integer>[] gsort = new ArrayList[M];
    static int n, m, cnt;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        PrintWriter out = new PrintWriter(System.out);

        n = sc.nextInt();
        for (int i = 1; i <= n; i++) a[i] = sc.nextInt();

        cnt = 0;
        for (int l = 1; l <= n; l += L) {
            cnt++;
            bl[cnt] = l;
            br[cnt] = Math.min(l + L - 1, n);
            gsort[cnt] = new ArrayList<>();
            for (int j = bl[cnt]; j <= br[cnt]; j++) {
                gid[j] = cnt;
                gsort[cnt].add(a[j]);
            }
            Collections.sort(gsort[cnt]);
        }

        m = sc.nextInt();
        while (m-- > 0) {
            int op = sc.nextInt();
            if (op == 1) {
                int x = sc.nextInt();
                int y = sc.nextInt();
                int id = gid[x];
                int old = a[x];
                a[x] = y;

                int index = Collections.binarySearch(gsort[id], old);
                gsort[id].remove(index);
                int pos = find(gsort[id], y);
                gsort[id].add(pos, y);
            } else {
                int l = sc.nextInt();
                int r = sc.nextInt();
                int p = sc.nextInt();
                int ans = 0;
                if (gid[l] == gid[r]) {
                    for (int i = l; i <= r; i++) {
                        if (a[i] < a[p])
                            ans++;
                    }
                } else {
                    for (int i = gid[l] + 1; i < gid[r]; i++) ans += get(i, a[p]);
                    for (int i = l; i <= br[gid[l]]; i++) {
                        if (a[i] < a[p])
                            ans++;
                    }
                    for (int i = bl[gid[r]]; i <= r; i++) {
                        if (a[i] < a[p])
                            ans++;
                    }
                }
                out.print((ans + 1) + " ");
            }
        }
        out.flush();
    }

    //寻找v的位置
    static int find(ArrayList<Integer> list, int v) {
        int l = 0, r = list.size() - 1;
        while (l < r) {
            int mid = l + r >> 1;
            if (list.get(mid) >= v) r = mid;
            else l = mid + 1;
        }
        if (list.get(r) >= v) return r;
        else return r + 1;
    }

    //寻找最后一个<v
    static int get(int id, int v) {
        int l = 0, r = gsort[id].size() - 1;
        while (l < r) {
            int mid = l + r + 1 >> 1;
            if (gsort[id].get(mid) < v) l = mid;
            else r = mid - 1;
        }
        if (gsort[id].get(r) < v) return r + 1;
        else return 0;
    }
}

区间修改添加区间修改逻辑即可lazy

0 评论

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

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