File tree Expand file tree Collapse file tree 1 file changed +70
-0
lines changed Expand file tree Collapse file tree 1 file changed +70
-0
lines changed Original file line number Diff line number Diff line change 1+ #include < bits/stdc++.h>
2+
3+ using namespace std ;
4+
5+ int const N = 4e5 + 1 ;
6+ int t, n, a[N], freq[N];
7+ vector<int > all;
8+
9+ int main () {
10+ scanf (" %d" , &t);
11+
12+ while (t-- != 0 ) {
13+ all.clear ();
14+ memset (freq, 0 , sizeof freq);
15+
16+ scanf (" %d" , &n);
17+ for (int i = 0 ; i < n; ++i) {
18+ scanf (" %d" , a + i);
19+ all.push_back (a[i]);
20+ }
21+
22+ sort (a, a + n);
23+
24+ for (int i = 0 ; i < n - 1 ; ++i) {
25+ if (a[i + 1 ] - a[i] <= 1 ) {
26+ continue ;
27+ }
28+
29+ all.push_back (a[i] + 1 );
30+ }
31+
32+ sort (all.begin (), all.end ());
33+ all.resize (unique (all.begin (), all.end ()) - all.begin ());
34+
35+ int mx = 0 ;
36+ for (int i = 0 ; i < n; ++i) {
37+ a[i] = lower_bound (all.begin (), all.end (), a[i]) - all.begin ();
38+ ++freq[a[i]];
39+ mx = max (mx, a[i]);
40+ }
41+
42+ long long res = 0 , diff;
43+ for (int i = 0 ; i < mx + 1 ; ++i) {
44+ if (freq[i] == 0 ) {
45+ continue ;
46+ }
47+
48+ res += freq[i];
49+
50+ while (i < N - 1 && freq[i] != 0 ) {
51+ while (i < N - 1 && freq[i + 1 ] >= freq[i]) {
52+ res += freq[i + 1 ] - freq[i];
53+ ++i;
54+ }
55+
56+ while (i < N - 1 && freq[i] > freq[i + 1 ]) {
57+ ++i;
58+ }
59+
60+ if (freq[i] == 0 ) {
61+ break ;
62+ }
63+ }
64+ }
65+
66+ printf (" %d\n " , res);
67+ }
68+
69+ return 0 ;
70+ }
You can’t perform that action at this time.
0 commit comments