/* -*- coding: utf-8 -*- * * 3269.cc: No.3269 Leq-K Partition - yukicoder */ #include #include #include using namespace std; /* constant */ const int MAX_N = 100000; /* typedef */ /* global variables */ int as[MAX_N]; bool used[MAX_N]; int res[MAX_N + 1]; /* subroutines */ int calc(int n, int k) { int cnt = 0; for (int i = 0; i < n;) { int j = i, s = 0; while (i < n && (s < k || (s == k && used[as[i]]))) { if (! used[as[i]]) s++, used[as[i]] = true; i++; } cnt++; for (; j < i; j++) used[as[j]] = false; } return cnt; } /* main */ int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", as + i), as[i]--; if (n <= 100) { for (int k = 1; k <= n; k++) res[k] = calc(n, k); } else { int b = sqrt(log2(n) * n); //printf(" b=%d\n", b); for (int k = 1; k <= b; k++) res[k] = calc(n, k); int maxq = (n + b - 1) / b; for (int q = 1, pk = n; q <= maxq; q++) { int k0 = 0, k1 = n; while (k0 + 1 < k1) { int k = (k0 + k1) / 2; if (calc(n, k) <= q) k1 = k; else k0 = k; } while (pk >= k1) res[pk--] = q; } } for (int k = 1; k <= n; k++) printf("%d\n", res[k]); return 0; }