首页 > 其他分享 >树状数组(二维偏序)

树状数组(二维偏序)

时间:2024-05-04 21:34:44浏览次数:18  
标签:偏序 sz idx nums int auto 树状 二维 vector

题目链接

https://leetcode.cn/problems/maximum-sum-queries/description/

题目大意

image

题目思路

二维偏序问题 -> 一维排序,一维树状数组!

题目代码

class Solution {
public:
    int sz;
    vector<int> tr;
    int lowbit(int x){return x & -x;}
    void update(int x,int k){
        for(int i = x;i <= sz;i += lowbit(i))
            tr[i] = max(tr[i],k);
    }
    int query(int x){
        int ans = -1;
        for(int i = x;i;i -= lowbit(i)) ans = max(ans,tr[i]);
        return ans;
    }
    vector<int> maximumSumQueries(vector<int>& nums1, vector<int>& nums2, vector<vector<int>>& queries) {
        int n = nums1.size(),m = queries.size();
        vector<array<int,2>> nums(n);
        for(int i = 0;i < n;++i) nums[i] = {nums1[i],nums2[i]};
        vector<array<int,3>> q(m);
        for(int i = 0;i < m;++i) q[i] = {queries[i][0],queries[i][1],i};
       // 离散化
        unordered_set<int> s;
        for(auto x:nums) s.insert(x[1]);
        for(auto x:q)    s.insert(x[1]);
        vector<int> list(s.begin(),s.end());
        sort(list.begin(),list.end());
        sz = list.size();
        map<int,int> mp;
        for(int i = 0;i < sz;++i) mp[list[i]] = i;
       // 一维排序
        sort(nums.begin(),nums.end(),[](const auto& a,const auto& b){return a[0] > b[0];});
        sort(q.begin(),q.end(),[](const auto& a,const auto& b){return a[0] > b[0];});

        tr.resize(sz + 10,-1);

        vector<int> ans(m);
        int idx = 0;
        for(auto qy:q){
            int x = qy[0],y = qy[1],i = qy[2];
            while(idx < n && nums[idx][0] >= x){
                update(sz - mp[nums[idx][1]],nums[idx][0] + nums[idx][1]);
                ++idx;
            }
            ans[i] = query(sz - mp[y]);
        }
        return ans;
    }
};

标签:偏序,sz,idx,nums,int,auto,树状,二维,vector
From: https://www.cnblogs.com/gebeng/p/18172718

相关文章

  • 力扣-304. 二维区域和检索
    1.题目题目地址(304.二维区域和检索-矩阵不可变-力扣(LeetCode))https://leetcode.cn/problems/range-sum-query-2d-immutable/题目描述给定一个二维矩阵matrix,以下类型的多个请求:计算其子矩形范围内元素的总和,该子矩阵的左上角为(row1, col1),右下角为(row2, co......
  • c#二维矩阵表示方法
    二维矩阵在C#中,可以使用二维数组或者嵌套的List来表示二维矩阵。以下是使用二维数组和List的示例代码。使用二维数组:introws=4;//行数intcols=5;//列数int[,]matrix=newint[rows,cols];//创建二维矩阵//初始化矩阵for(inti=0;i<rows;i++){......
  • java获取树状结构
    /***转成树状结构*/publicList<DictVO>toTree(List<DictVO>list){List<DictVO>treelist=newArrayList<DictVO>();for(DictVOoutBean:list){for(DictVOinBean:list){Longoutid=outBean.getId();Longinpid=inBean......
  • vector开二维数组&&深搜迷宫问题&&BFS
    vector<vector>vis(N+10(一维的大小),vector(N+10(二维的大小),0(初始化赋值)),step(N+10,vector(N+10,0));vector<vector>vis(N+10,vector(N+10)),step(N+10,vector(N+10));开数组大小一定要超过题目本身大小;#include<bits/stdc++.h>usingnamespacestd;#defineintl......
  • 通过fatsadmin阿里云OSS存储插件-生成二维码图片,并上传阿里云OSS存储空间里
    #生成二维码并上传到阿里云OSSif(!function_exists('create_qrcode')){functioncreate_qrcode($url){$filename=time().rand(100,999).'.png';$path='uploads/qrcode/'.$filename;$code=newQRcode();$......
  • 三维偏序
    cdq分治:一个长度为\(n\)的序列,统计有一些特性的点对\((i,j)\)的数量/找到一对点\((i,j)\)使得一些函数的值最大。对于这一类问题,我们考虑使用\(\rmcdq\)分治思想来解决。什么是\(\rmcdq\)分治思想?\(\rmcdq\)解决这种问题所使用的是分治思想,但却有些不同,具体......
  • 【计算几何】二维基础 (丑陋的)板子
    符号判断与大小比较intsgn(intx){ if(fabs(x)<eps)return0; elseif(x>=eps)return1; elsereturn-1;}//实数的向上取整函数int_ceil(constdouble&x){longlongk=ceil(x);while(k<x)k++;while(k>x+1)k--;returnk;}点structPoint......
  • 二维矩阵、关键功能、关键质量测试
    答题纸 1、 绘制需求层次-需求方面二维矩阵。 功能质量约束业务级需求在线的房屋租赁系统,完善的房屋匹配机制。 可用性、可靠性、安全性、房源、需要移动端和网页端用户级需求用户:租赁者、管理员、房主房主:即使看到房屋的看房信息。......
  • react-native-vision-camera 扫二维码报错 [unknown/unknown] Waiting for the barcod
    1.问题:使用react-native-vision-camera库扫描解析二维码时,部分手机出现如下报错:2.解决:android/app/build.gradle文件中添加依赖:dependencies{//...implementation'com.google.mlkit:barcode-scanning:17.2.0'}3.参考:GitHub相关issues......
  • vue 高德地图 三维切换为二维
    在Vue中使用高德地图进行三维与二维视图的切换,可以通过操作地图实例的setMapType方法来完成。以下是一个简单的示例:首先确保安装并导入了高德地图的JavaScriptAPI。在Vue组件中,初始化高德地图,并创建地图实例。使用一个方法来切换地图的视图模式。<template><divid="map"......