目录
离散化:
关键词:整数、有序、保序
定义:给定一个大区间范围数,选取少量数存在数组中,并且数映射到一片连续的下标
步骤:
1.一串数中不能有重复的数,所以首先要排序并且去重 库函数
vector <int> alls;
sort(alls.begin(),alls.end());
alls.erase(unique(alls.begin,alls.end()),alls.end());
2.如何快速的找出数的离散化对应的值 二分查找
void check (int x)
{
int l=0,r=alls.size()-1;
while(l<r)
{
int mid=r+l>>1;
if(all[mid]>=x) r=mid;
else l=mid+1;
}
return r+1;
}
区间和代码实现
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
const int N=300010;
typedef pair<int,int> PII;
vector <PII> add,query;
vector <int> alls;
int a[N],s[N];
int find (int x)
{
int l=0,r=alls.size()-1,mid=0;
while(l<r)
{
mid=l+r>>1;
if(alls[mid]>=x) r=mid;
else l=mid+1;
}
return l+1; ///
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
{
int x,c;
cin>>x>>c;
add.push_back({x,c});
alls.push_back(x);
}
for(int i=0;i<m;i++)
{
int l,r;
cin>>l>>r;
query.push_back({l,r});
alls.push_back(l);
alls.push_back(r);
}
sort(alls.begin(),alls.end());
alls.erase(unique(alls.begin(),alls.end()),alls.end());
for(auto item: add)
{
int x=find(item.first);
a[x]+=item.second;
}
for(int i=1;i<=alls.size();i++)
{
s[i]=s[i-1]+a[i];
}
for(auto item : query)
{
int l=find(item.first),r=find(item.second);
cout<<s[r]-s[l-1]<<endl;
}
return 0;
}
unique函数的实现(双指针算法)
vector<int>::iterator unique(vector<int> &a)
{
int j=0;
for(int i=0;i<a.size();i++)
{
if(!i||a[i]!=a[i-1])
{
a[j++]=a[i];
}
}
return a.begin()+j;
}
区间合并(模拟+贪婪)
解释:不断更新有交集的的区间的,可以快速得到区间的个数。
算法步骤:
1、按照区间的左端点进行排序
2、遍历值从左到右,每次进入一个区间会有三种情况,每达到前两种情况则更新区间 的范围,一旦达到第三种情况,即进入下一个区间,则更新st和ed的值,前一个区 间将被保存。
区间合并代码实现
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
typedef pair<int,int> PII;
vector <PII> egs;
void merge_sort(vector<PII> &egs)
{
sort(egs.begin(),egs.end());
vector <PII> res;
int st=-2e9,ed=-2e9;
for(auto eg:egs)
{
if(ed<eg.first)
{
if(st!=-2e9) res.push_back({st,ed});
st=eg.first,ed=eg.second;
}else ed=max(ed,eg.second);
}
if(st!=-2e9) res.push_back({st,ed});
egs=res;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int l,r;
cin>>l>>r;
egs.push_back({l,r});
}
merge_sort(egs);
cout<<egs.size();
return 0;
}