首页 > 其他分享 >由区间合并->离散化

由区间合并->离散化

时间:2024-03-05 21:12:30浏览次数:19  
标签:下标 int 合并 back indexes 离散 push 区间 adds

       ` #include<iostream>
        #include<cstring>
        #include<vector>
        #include<algorithm>
        using namespace std;
        typedef pair<int,int> PII; //数对 type-类型 define-定义 pair-一对
        const int N=300010;
        int a[N],s[N];//分别用来存储数轴上的数,及前缀和
        vector<PII> adds,query;//分别存储题目中的下标x的数进行+c操作和查询操作
        vector<int> indexes;//存储所有操作涉及到的下标,对这些不连续下标进行离散化
        int find(int x)//简单的二分查找,寻找元素对应的下标
        {
        int n=indexes.size();
        int l=0,r=n-1;
        while(l<r)
        {
            int mid=l+r>>1;
            if(indexes[mid]>=x) r=mid;
            else l=mid+1;
        }
        return l+1; // 映射到1, 2, ...n
        }
        int main()
        {
        int n,m;
        cin>>n>>m;
        while (n -- )
        {
            int x,c;
            cin>>x>>c;
            indexes.push_back(x);//存储adds操作相关下标
            adds.push_back({x,c});//记录adds操作
        }
        while(m--)
        {
            int l,r;
            cin>>l>>r;
            //indexes.push_back(l);
            //indexes.push_back(r);//存储query操作相关下标
            query.push_back({l,r});//记录query操作
        }
        //进行离散化
        sort(indexes.begin(),indexes.end());
        indexes.erase(unique(indexes.begin(),indexes.end()),indexes.end());//[**先排序,在去重; erase()擦除使用unique()后无意义的部分**](https://blog.csdn.net/sandalphon4869/article/details/98209093)

        for(auto ad:adds)//进行加c操作
        {
            int x=find(ad.first);//找到原下标对应的离散值
            int value=ad.second;//存储adds操作的value
            a[x]+=value;//在一个新的连续数组上存储原不连续数组元素的值
        }

        for(int i=1;i<=indexes.size();i++)//求前缀和
        {
            s[i]=s[i-1]+a[i];
        }

        for(auto q:query)
        {
            int l=find(q.first);//将查询的区间转化为对应的离散化之后的区间
            int r=find(q.second);
            cout<<s[r]-s[l-1]<<endl;
        }

        return 0;
        }`

标签:下标,int,合并,back,indexes,离散,push,区间,adds
From: https://www.cnblogs.com/LQWUI/p/18054967

相关文章

  • 合并与分离及分离借形
    合并ctrl+j(join)其中,当选择多个物体时,-Selected选中项,是橙红色-Active活动项,橙黄色合并的方向为:Selected->Active分离选中一部分顶点分离编辑模式下,Ctrl+L(Link)选中相连项。拆分选中一部分顶点拆分,但仍属于同一物体。分离借形一种常见的手法S......
  • (36/60)无重叠区间、划分字母区间、合并区间
    无重叠区间leetcode:435.无重叠区间贪心法思路去掉最少的区间数就是最少重叠区间对的个数。(成对的算,因为一对里面需要去掉一个)类似射气球的处理方式。左边界法:按左边界从小到大排序。遍历每个元素。取当前元素右边界为right判断是否重叠。如果[i]right>[i+1]left......
  • 合并Excel文件
    合并Excel文件需求:把多个Excel文件合并到一个Excel文件的不同表格中。且需要合并的文件前后缀一致。对合并完成的文件中每张表指定列找出最大值标红XXX表示需要自己填写的内容importosimportpandasaspdfromopenpyxlimportload_workbookfromopenpyxl.stylesi......
  • 代码随想录算法训练营第三十六天 | 56. 合并区间,763.划分字母区间,435. 无重叠区间
    435.无重叠区间 已解答中等 相关标签相关企业 给定一个区间的集合 intervals ,其中 intervals[i]=[starti,endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 示例1:输入:intervals=[[1,2],[2,3],[3,4],[1,3]]输出:1解......
  • 如何合并两个PDF
      不用安装其它合并工具,wpsoffice本身自带的PDF工具中就有PDF合并工具,且稳定好用。新建pdf, 选择PDf工具中的合并PDF即可,合并后将不需要的页面删除。 ......
  • 代码随想录算法训练营第三十六天| ● 435. 无重叠区间 ● 763.划分字母区间 ● 56.
    无重叠区间 题目链接:435.无重叠区间-力扣(LeetCode)思路:我的思路是先将所有区间按左端点从小到大排序,左端点相同时右端点从小到大排序。接下来遍历数组,如果下一个区间与该区间有重叠部分,count加1,同时遍历下下一个区间(下一个区间被视为删除),同时如果下一个区间被包含在该区间中,......
  • Luogu P1220 关路灯 题解 [ 蓝 ][ 区间dp ]
    关路灯题目描述某一村庄在一条路线上安装了\(n\)盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少)。老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯。为了给村里节省电费,老张记录下了每盏路灯的位置和功率,他每次关......
  • 2024 ICPC Asia Pacific Championship-K-线段树合并or主席树
    比赛链接:https://codeforces.com/contest/1938给一棵有根树,执行以下代码:letLbeanemptyarrayforx=1ton fory=1ton append((x-1)*n*n+(LCA(x,y)-1)*n+(y-1))toLsortLinnon-decreasingorder然后进行\(q\)次询问,每次问\(L\)中第......
  • 离散化
    记录14:292024-3-4目录1.离散化1.离散化如果数据范围太大,但是数据个数并不是很多,可以离散化后,保留了数据的大小关系问题的范围虽然定义在集合,但是只涉及其中的有限数值,并且与数值的绝对大小无关(只把这些数值作为代表,或只与他们的相对顺序有关)点击查看代码voiddiscre......
  • 246. 区间最大公约数
    #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>usingnamespacestd;typedeflonglongLL;constintN=500010;intn,m;LLw[N];structNode{intl,r;LLsum,d;}tr[N*4];LLgcd(LL......