/
LANG: C
ID: logoo2
PROG: milk2
/
#include <stdio.h>
#define max(a, b) ((a)>(b)?(a):(b))
#define min(a, b) ((a)<(b)?(a):(b))
#define swap(a, b) do{\
struct far tmp;\
tmp = a;\
a = b;\
b = tmp;\
}while(0)
struct far{
int start, end;
}far[5000];
int com(struct far a, struct far b)
{
return a->start – b->start;
}
void insert_sort(int s, int t)
{
int i, j;
struct far key;
for(i = s + 1; i <= t; i++){
key = far[i];
/
mistack 3:
下面的j >= s 写成了 j >= 0
/
for(j = i – 1; com(&key, &far[j]) < 0 && j >= s; j–){
far[j + 1] = far[j];
}
far[j + 1] = key;
}
}
void choose(int s, int t)
{
int mid = (s + t) / 2;
/
mistack 5:
下面比较的顺序原来是:
if(com(&far[mid], &far[s]) < 0){
swap(far[mid], far[s]);
}
if(com(&far[mid], &far[t]) > 0){
swap(far[mid], far[t]);
}
if(com(&far[s], &far[t]) > 0){
swap(far[s], far[t]);
}
但是碰到, far[s] > far[mid] > far[t] 的情况就会出问题..
/
if(com(&far[mid], &far[s]) < 0){
swap(far[mid], far[s]);
}
if(com(&far[s], &far[t]) > 0){
swap(far[s], far[t]);
}
if(com(&far[mid], &far[t]) > 0){
/
mistack 4:
误把下面的far[t]写成了far[s]
/
swap(far[mid], far[t]);
}
swap(far[t – 1], far[mid]);
}
void sort(int s, int t)
{
int i, j;
if(t – s < 9){
insert_sort(s, t);
return ;
}
choose(s, t);
i = s, j = t – 1;
while(i < j){
while(com(&far[++i], &far[t – 1]) < 0){
continue;
}
while(com(&far[–j], &far[t – 1]) > 0){
continue;
}
if(i < j){
swap(far[i], far[j]);
}
}
swap(far[t – 1], far[i]);
/
mistack 2:
对快排的代码并不是特别的熟练,打完了上面的代码后忘记继续进行递归了。。
/
sort(s, i – 1);
sort(i + 1, t);
}
int main(void)
{
int n;
int i;
struct far now;
int ans1 = 0, ans2 = 0;
freopen("milk2.in", "r", stdin);
freopen("milk2.out", "w", stdout);
scanf("%d\n", &n);
for(i = 0; i < n; i++){
scanf("%d%d", &far[i].start, &far[i].end);
}
// qsort(far, n, sizeof(struct far), com);
sort(0, n – 1);
now = far[0];
for(i = 1; i < n; i++){
if(far[i].start <= now.end){
now.end = max(now.end, far[i].end);
}else{
if(now.end – now.start > ans1){
ans1 = now.end – now.start;
}
if(far[i].start – now.end > ans2){
ans2 = far[i].start – now.end;
}
now = far[i];
}
}
/
mistack 1:
在退出循环时应该把最后剩下的数据进行判断.
/
if(now.end – now.start > ans1){
ans1 = now.end – now.start;
}
printf("%d %d\n", ans1, ans2);
return 0;
}