离散化学习心得

来源:互联网 发布:ipv4和ipv6无网络访问 编辑:程序博客网 时间:2024/04/28 23:02

例如,poj2528,是个线段树问题,但是由于数据量非常大,所以如果不离散化的话就一定会MLE,所以我们这里要用到离散化。

就拿2528的离散化来说吧,因为我们只需要他的左右支点坐标,他就是把每个点映射在坐标上,然后将他们排序,排序过后就分别给他们赋值(注意,只能给不同的赋值,相同的赋值一次就好了),这样原来很大的值就被缩小了:

就2528来说,离散化操作的代码如下:


a[mx ] [2]   //a[i][0],a[i][1]分别表示左右节点;

struct ss
{
   int weizhi;  //为他标上一个序号
   int point;   //输入的值


}san[mx*4];  // 结构体,用于存储输入的数据


bool cmp(ss a1,ss a2)
{
    return  a1.point<a2.point;
}



  for(i=0;i<n;i++)
            {
                scanf("%d %d",&a[i][0],&a[i][1]);
                san[i*2].point=a[i][0];
                san[i*2+1].point=a[i][1];
                san[i*2].weizhi=-(i+1);   //左支记为  --(i+1);
                san[i*2+1].weizhi=i+1;
            }
            sort(san,san+n*2+1,cmp);  //将他按大小顺序排序
            int temp=san[0].point;
            int cnt=1;    //计算不同点的个数


            for(i=0;i<n*2;i++)
            {
                if(temp!=san[i].point)
                {
                    cnt++;
                    temp=san[i].point;
                }
               if(san[i].weizhi<0)
               {
                   a[-san[i].weizhi-1][0]=cnt;


               }
               else a[san[i].weizhi-1][1]=cnt;


            }



0 0
原创粉丝点击