50129. Loops
難度:3.5/51
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
57
58
59
60
61
62#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include "loops.h"
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
static int vis[1000005] = {0};
int next_idx(int* a, int *b[], int idx){
return (b[idx] - a);
}
static int max_num;
static int min_num;
static int len;
void traverse(int *a, int *b[], int idx){
max_num = INT_MIN, min_num = INT_MAX, len = 0;
while(!vis[idx]){
vis[idx] = 1;
max_num = max(max_num, a[idx]);
min_num = min(min_num, a[idx]);
len++;
idx = next_idx(a, b, idx);
}
}
void loops(int n, int *a, int *b[], int ans[4]){
for(int i = 0; i < n; i++) vis[i] = 0;
int min_len = INT_MAX;
int min_el = INT_MAX;
int max_len = INT_MIN;
int max_el = INT_MIN;
for(int i = 0; i < n; i++){
if(vis[i]) continue;
traverse(a, b, i);
if(len < min_len){
min_el = min_num;
min_len = len;
}
else if(len == min_len){
min_el = min(min_el, min_num);
}
if(len > max_len){
max_el = max_num;
max_len = len;
}
else if(len == max_len){
max_el = max(max_el, max_num);
}
}
ans[0] = max_len;
ans[1] = min_len;
ans[2] = max_el;
ans[3] = min_el;
}