Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define prev prev_i_love_std
- #define rank rank_i_love_std
- using namespace std;
- const int MAXN = 500010;
- vector<int> a;
- vector<int> prev;
- int p[MAXN];
- int rank[MAXN];
- double add[MAXN];;
- int left1[MAXN];
- int right1[MAXN];
- int n;
- inline int get(int a) {
- int b = a;
- while (a != p[a]) a = p[a];
- while (b != a) {
- int tmp = p[b];
- p[b] = a;
- b = tmp;
- }
- return b;
- }
- void join(int a, int b) {
- a = get(a);
- b = get(b);
- if (rank[a] < rank[b]) swap(a, b);
- p[b] = a;
- add[a] += add[b];
- right1[a] = max(right1[a], right1[b]);
- left1[a] = min(left1[a], left1[b]);
- if (rank[a] == rank[b])
- rank[a]++;
- }
- bool check(double x) {
- for (int i = 0; i <= n; i++)
- add[i] = rank[i] = 0;
- for (int i = 0; i <= n; i++) p[i] = left1[i] = right1[i] = i;
- double sum = 0;
- double total = 0;
- for (int i = 0; i < n; i++){
- sum += x - 1;
- add[i + 1] = x - 1;
- total += x - 1;
- if (prev[i] != -1) {
- int tmp = get(right1[get(prev[i])] + 1);
- add[tmp] += 1;
- total += 1;
- sum += 1;
- while (add[tmp] >= 0 && left1[tmp]) {
- assert(p[tmp] == tmp);
- if (right1[tmp] == i + 1) return true;
- add[get(right1[tmp]+1)] += add[tmp];
- add[tmp] = 0;
- join(tmp, left1[tmp] - 1);
- tmp = get(right1[get(tmp)] + 1);
- }
- }
- }
- return false;
- }
- int main(){
- clock_t start = clock();
- ios_base::sync_with_stdio(0); cin.tie(0);
- cin >> n;// scanf("%d",&n);
- a = vector<int>(n);
- for (int i = 0; i < n; i++) {
- int x; cin >> x; a[i] = x; // scanf("%d", &x);
- }
- int c = 0;
- {
- prev = vector<int>(n);
- map<int, int> _prev;
- for (int i = 0; i < n; i++) {
- auto it = _prev.find(a[i]);
- if (it != _prev.end()) {
- prev[i] = _prev[a[i]];
- _prev[a[i]] = i;
- a[i] = a[prev[i]];
- } else {
- prev[i] = -1;
- _prev[a[i]] = i;
- a[i] = c++;
- }
- }
- }
- double l = 0, r = 1;
- for (int i = 0; i < 40; i++) {
- double x = (l + r) / 2;
- if (check(x))
- r = x;
- else
- l = x;
- }
- fprintf(stderr, "%.10f %.10f\n", l, r);
- int p, q;
- p = q = -1;
- for (int i = 1; i <= n; i++) {
- double ll = l * i;
- double rr = r * i;
- double res = round(ll);
- if (ll <= res && res <= rr) {
- if (p == -1) p = res, q = i;
- assert(q * (long long)res - p * (long long) i == 0);
- }
- }
- printf("%d %d\n", p, q);
- fprintf(stderr, "time = %.10f\n", (double)(clock() - start) / CLOCKS_PER_SEC);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement