50071. Attraction Order

難度:3.8/5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "attraction.h"

int n, m;
Attraction* pt;

typedef struct{
Attraction* p;
int dis;
int group;
} s_info;

static inline int min(int a, int b){
if(a < b) return a;
return b;
}

static inline int cal_dis(Attraction* p){
return min(min(n - p->x, p->x + 1), min(n - p->y, p->y + 1));
}

int cmp(const void* a, const void* b){
s_info* pt_a = (s_info*)a;
s_info* pt_b = (s_info*)b;
if(pt_a->dis != pt_b->dis) return (pt_a->dis > pt_b->dis) ? 1 : -1;
else if(pt_a->group != pt_b->group) return (pt_a->group > pt_b->group) ? 1 : -1;
else{
if(pt_a->group == 0) return ((pt_a->p)->x > pt_b->p->x) ? 1 : -1;
else if(pt_a->group == 1) return (pt_a->p->y > pt_b->p->y) ? 1 : -1;
else if(pt_a->group == 2) return (pt_a->p->x < pt_b->p->x) ? 1 : -1;
else return (pt_a->p->y < pt_b->p->y) ? 1 : -1;
}
}

int main(int argc, char *argv[]){
scanf("%d %d", &n, &m);
FILE* fp = fopen(argv[1], "rb");
pt = (Attraction*) malloc(sizeof(Attraction) * m);
fread(pt, sizeof(Attraction), m, fp);
s_info* info = (s_info*) malloc(sizeof(s_info) * m);
for(int i = 0; i < m; i++){
info[i].p = &(pt[i]);
info[i].dis = cal_dis(&(pt[i]));
if(pt[i].y + 1 == info[i].dis) info[i].group = 0;
else if((n - pt[i].x == info[i].dis)) info[i].group = 1;
else if((n - pt[i].y == info[i].dis)) info[i].group = 2;
else info[i].group = 4;
}
qsort(info, m, sizeof(s_info), cmp);
for(int i = 0; i < m; i++){
printf("%d %d\n", info[i].p->x, info[i].p->y);
}
}


50071. Attraction Order
https://aaronlin1229.github.io/judgegirl_50071/
Author
Akizumi
Posted on
July 17, 2023
Licensed under