由区间和->离散化

       ` #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;
        }`
posted @ 2024-03-05 21:05  这就叫做C++  阅读(3)  评论(0编辑  收藏  举报