标签:ras 前缀 添加 活动 http algo fir info value
百度百科解释:
离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。
这就是一个十分标准可以利用离散化来解答的题目。因为数据范围是-10^9 至 10^9,而数据数量只有10^5。
我们只需要把所有用到的坐标全部存储起来,将其排序之后一个一个离散化到一个新的坐标轴上,使数据直接相邻,节省了大量空间。
然后是代码实现:
#include <iostream> #include <vector> #include <algorithm> using namespace std; typedef pair<int,int> PII; const int N = 300010; //离散化数组 vector<int>alls; //存放了插入数值和查询区间两种操作所用到的坐标以及值 vector<PII>add,query; //a[N]是离散化后存放value的数组,s[N]是离散化之后的下标对应的前缀和数组 int a[N],s[N]; int n,m; //实现根据原坐标x寻找离散化后坐标的函数find int find(int x){ //二分模板 int l = 0 , r = alls.size()-1; while(l < r){ int mid = l + r >> 1; if(alls[mid] >= x){ r = mid; } else l = mid + 1; } return r+1 ; } int main(){ //读入数据 cin>>n>>m; //先读入需要插入的点的坐标和数值 int x,c; for(int i = 0 ; i < n ; i ++){ cin>>x>>c; //添加到对应的容器中存储; alls.push_back(x); add.push_back( {x,c} ); } //再读入需要查询的区间的左右坐标 int l,r; for(int i = 0 ; i < m ; i++ ){ cin>>l>>r; alls.push_back(l); alls.push_back(r); query.push_back( {l,r} ); } //对离散化数组进行排序和去重 sort(alls.begin(),alls.end()); alls.erase(unique(alls.begin(),alls.end()),alls.end()); //处理插入操作 for(auto it:add){ int x = find(it.first); a[x] += it.second; } //预处理前缀和数组 for(int i = 1 ;i <= alls.size() ; i ++) s[i] += s[i-1] + a[i]; //执行查询操作 for(auto it:query){ int l = find(it.first); int r = find(it.second); cout<< s[r] - s[l - 1]<<endl; } return 0; }
标签:ras 前缀 添加 活动 http algo fir info value
原文地址:https://www.cnblogs.com/Flydoggie/p/12241970.html