例如,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;
}