1.题面
acm.zjnu.edu.cn/CLanguage/showproblem?problem_id=1407
http://acm.zjnu.edu.cn/CLanguage/showproblem?problem_id=1399
2.题意
题意应该不用讲了,就是排序,一个是整数排序,另一个是将三个坐标按照一定规则排序。
3.解题思路
只是为了测试一下我新写的归并排序,先挂上来
template<typename T>
inline void merge(T *host,T *guest,int len,int wide){
int l_p,r_p,gst_p;
int start,mid,end;
for (start=0;start<len;start=end){
l_p = gst_p = start;
r_p = mid = start + (wide>>1) < len? start + (wide>>1): len;
end = start + wide < len? start + wide: len;
while (l_p<mid&&r_p<end){
if (host[l_p]<host[r_p])
guest[gst_p++] = host[l_p++];
else
guest[gst_p++] = host[r_p++];
}
while (l_p<mid) guest[gst_p++] = host[l_p++];
while (r_p<end) guest[gst_p++] = host[r_p++];
}
}
template<typename T>
void mergesort(T *host,int len){
T *guest = new T[len];
for (int wide=1;wide<len;){
merge(host,guest,len,wide<<=1);
merge(guest,host,len,wide<<=1);
}
delete guest;
}
附加一个带比较器的版本
template<typename T, typename _Compare>
inline void merge(T *host, T *guest, int len, int wide, _Compare comp){
int l_p,r_p,gst_p;
int start,mid,end;
for (start=0;start<len;start=end){
l_p = gst_p = start;
r_p = mid = start + (wide>>1) < len? start + (wide>>1): len;
end = start + wide < len? start + wide: len;
while (l_p<mid&&r_p<end){
if (comp(host[l_p],host[r_p])) guest[gst_p++] = host[l_p++];
else
guest[gst_p++] = host[r_p++];
}
while (l_p<mid) guest[gst_p++] = host[l_p++];
while (r_p<end) guest[gst_p++] = host[r_p++];
}
}
template<typename T, typename _Compare>
void mergesort(T *host,int len,_Compare comp){
T *guest = new T[len];
for (int wide=1;wide<len;){
merge(host,guest,len,wide<<=1,comp);
merge(guest,host,len,wide<<=1,comp);
}
delete guest;
}
附加一个计算逆序数的版本
/*
* 计算出 数组中满足 i<j 且 a[i] > a[j] 的数字的个数
* 注意cmp函数必须这样写
*/
bool cmp(int a,int b){
return a <= b;
}
template<typename T, typename _Compare>
inline ll merge(T *host, T *guest, int len, int wide, _Compare comp){
int l_p,r_p,gst_p;
int start,mid,end;
ll ret = 0;
for (start=0;start<len;start=end){
l_p = gst_p = start;
r_p = mid = start + (wide>>1) < len? start + (wide>>1): len;
end = start + wide < len? start + wide: len;
while (l_p<mid&&r_p<end){
if (comp(host[l_p],host[r_p])){
guest[gst_p++] = host[l_p++];
ret += r_p - mid;
}else {
guest[gst_p++] = host[r_p++];
}
}
while (l_p<mid) {
guest[gst_p++] = host[l_p++];
ret += r_p - mid;
}
while (r_p<end){
guest[gst_p++] = host[r_p++];
}
}
return ret;
}
template<typename T, typename _Compare>
ll mergesort(T *host,int len,_Compare comp){
T *guest = new T[len];
ll ret = 0;
for (int wide=1;wide<len;){
ret += merge(host,guest,len,wide<<=1,comp);
ret += merge(guest,host,len,wide<<=1,comp);
}
delete guest;
return ret;
}
4.解题代码
暂缺