我对离散化的一些感悟
  1b1UkOTfE3rN 2023年11月02日 51 0


如果是区间的离散化,一般区间会涉及覆盖关系, 那么运用离散化之后,区间的覆盖关系不能变,例如:

1——10 ,2——7 ,3——11,6——22;

将坐标从小到大排序,也就是1,2,3,6,7,10,11,22

那么新的区间也就是

1——6

2——5

3——7

4——8

覆盖关系没变,但是值小了很多,瞬间就减少了内存消耗

int seg[maxn][2];//保存原来的点

 struct node
 {
 	int p;
 	int line;
 }mat[maxn<<1]

 for(.....)
 {
 	scanf(".....");
 	mat[i<<1].line=-(i+1);
 	mat[i<<1|1].line=(i+1);
 	mat[i<<1].p=seg[i][0];
 	mat[i<<1|1].p=seg[i][1];
 }

 sort(mat,mat+2*n,cmp);
 for(.....)
 {
     if(temp!=seg[i].p)//防止相同端点映射到不同的点,temp是上一个点 
     {
         ans++;
         temp=seg[i].p;
     }
     if(mat[i].line<0) //左边,line 存的就是第i+1条边 
        seg[-mat[i].line-1][0]=ans;//离散这条边的左端 
     else
         seg[mat[i].line-1][1]=ans;//离散这条边的右端 
      }

这样的话,离散前的点是没了,如果我们不需要离散前的点,那么可以这么做,如果需要的话,可以开数组保存下来或者用map,把离散前的坐标当成key,离散化的做value。这样即离散了坐标,也保留了原坐标


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
1b1UkOTfE3rN