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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
| // 42jerrykim.github.io에서 더 많은 정보를 확인 할 수 있습니다.
#include <bits/stdc++.h>
using namespace std;
static inline void addRange(vector<int>& diff, int l, int r, int m) {
if (l < 1) l = 1;
if (r > m) r = m;
if (l <= r) {
diff[l] += 1;
diff[r + 1] -= 1;
}
}
// Trim [ns, ne] to exclude overlap with [ps, pe] using the known accepted rules.
static inline void trimAgainst(int& ns, int& ne, int ps, int pe) {
if (ne < ns) return;
if (ps <= ns && ne <= pe) { // fully contained → drop
ns = INT_MAX; ne = 0; return;
}
if (pe < ns || ne < ps) return; // disjoint
if (pe == ne && ns < ps) { // share right end, keep left-only extension
ne = ps - 1; return;
}
if (ps == ns && pe < ne) { // share left end, keep right-only extension
ns = pe + 1; return;
}
}
static vector<int> buildGroups(const vector<int>& v, int n, int m) {
vector<int> diff(m + 3, 0);
auto interval = [&](int x, int y) -> pair<int,int> {
int l = min(x, y) + 1;
int r = max(x, y) - 1;
return {l, r};
};
// First pair
auto [fs, fe] = interval(v[1], v[2]);
addRange(diff, fs, fe, m);
int ls = fs, le = fe;
// Middle pairs
for (int i = 3; i <= n; ++i) {
auto [ns, ne] = interval(v[i - 1], v[i]);
trimAgainst(ns, ne, ls, le);
addRange(diff, ns, ne, m);
ls = ns; le = ne;
}
// Closing pair (wrap-around)
{
auto [ns, ne] = interval(v[n], v[n + 1]);
trimAgainst(ns, ne, ls, le);
trimAgainst(ns, ne, fs, fe);
addRange(diff, ns, ne, m);
}
// Prefix to counts
vector<int> groups(m + 1, 0);
int cur = 0;
for (int k = 1; k <= m; ++k) {
cur += diff[k];
groups[k] = cur;
}
return groups;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
if (!(cin >> n >> m)) return 0;
vector<int> a(n + 1);
vector<int> freq(m + 1, 0);
for (int i = 1; i <= n; ++i) {
cin >> a[i];
if (1 <= a[i] && a[i] <= m) freq[a[i]]++;
}
// First pass: use original order with wrap a[n+1] = a[1]
vector<int> v1(n + 2);
for (int i = 1; i <= n; ++i) v1[i] = a[i];
v1[n + 1] = v1[1];
vector<int> g1 = buildGroups(v1, n, m);
// Second pass: rotate start by one
vector<int> v2(n + 2);
for (int i = 1; i <= n; ++i) v2[i] = a[i % n + 1];
v2[n + 1] = v2[1];
vector<int> g2 = buildGroups(v2, n, m);
// Answer for each k
for (int k = 1; k <= m; ++k) {
if (freq[k] == 0) {
cout << -1 << (k == m ? '\n' : ' ');
} else {
int extra = max(g1[k], g2[k]);
int moves = (n - freq[k]) + extra;
cout << moves << (k == m ? '\n' : ' ');
}
}
return 0;
}
|