洛谷【P1469】 ---- 离散化

离散化

  “离散化,就是把无限空间中有限的个体映射到有限的空间中去,以提高算法的时空效率。”

  离散化用于数据比较大,但是分布比较分散。

  离散化就是将一些分散的单位,聚合在一起对他们进行一些操作。

  使用离散化处理需要注意

//下面使用了STL中的sort(排序),unique(去重),lower_bound(查找)函数
sort(t + 1, t + n + 1);//排序
int m = unique(t + 1, t + 1 + n) - t - 1;//去重,并获得去重后的长度m
for(int i = 1;i <= n;i++) {
    a[i] = lower_bound(t + 1, t + 1 + m, a[i]) - t;//通过二分查找,快速地把元素和映射对应起来
}

【洛谷P1496】

思路:通过排序将数据离散化 + 差分,根据区间求解即可

 AC-Code
1 #include <cstdio> 2 #include <algorithm> 3 //#include <unordered_map> 4 using namespace std; 5 const int MAXN = 20000+5; 6 int a[MAXN],b[MAXN]; 7 int s[MAXN*2]; 8 int vis[MAXN*2]; 9 int main(){ 10 int N,cnt=1; 11 // unordered_map<int,int>m; 12 scanf("%d",&N); 13 for(int i=0;i<N;i++){ 14 scanf("%d%d",&a[i],&b[i]); 15 s[cnt++]=a[i]; 16 s[cnt++]=b[i]; 17 } 18 sort(s+1,s+cnt); 19 cnt=unique(s+1,s+cnt+1)-s-1; 20 for(int i=0;i<N;i++){ 21 a[i]=lower_bound(s+1,s+cnt,a[i])-s; 22 b[i]=lower_bound(s+1,s+cnt,b[i])-s; 23 // printf("%d %d\n",a[i],b[i]); 24 vis[a[i]]++;vis[b[i]]--; 25 } 26 int ans=0; 27 for(int i=1;i<cnt;i++){ 28 vis[i]+=vis[i-1]; 29 // printf("%d %d\n",s[i],vis[i]); 30 if(vis[i]){ 31 // printf("%d %d\n",s[vis[i]],s[vis[i-1]]); 32 ans+=s[i+1]-s[i]; 33 } 34 } 35 printf("%d\n",ans); 36 return 0; 37 }

 

posted @ 2019-10-31 13:50  流浪AC  阅读(328)  评论(3编辑  收藏  举报