Submission #955422

# Submission time Handle Problem Language Result Execution time Memory
955422 2024-03-30T12:14:08 Z yoav_s Diversity (CEOI21_diversity) C++17
0 / 100
2 ms 2652 KB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef vector<ll> v;
typedef vector<v> vv;
typedef vector<vv> vvv;
typedef pair<ll,ll> p;
typedef vector<p> vp;
typedef vector<vp> vvp;
typedef vector<vvp> vvvp;
typedef pair<ll, p> tri;
typedef vector<tri> vtri;
typedef vector<vtri> vvtri;
typedef vector<vvtri> vvvtri;
typedef vector<bool> vb;
typedef vector<vb> vvb;
typedef vector<vvb> vvvb;

#define f first
#define s second
#define pb push_back
#define eb emplace_back
#define all(v) (v).begin(),(v).end()

const ll INF = 1e18;
const ll mod = 1e9 + 7;
const ll maxValue = 3e5;

ll evaluate(v &segments)
{
    ll N = 0;
    for (ll x : segments) N += x;
    ll l = 0;
    ll res = 0;
    for (ll x : segments)
    {
        ll r = l + x - 1;
        res += ((r - l + 1) * (r - l + 2)) / 2 + l * (N - r - 1) + (r - l + 1) * l + (r - l + 1) * (N - r - 1);
        l += x;
    }
    return res;
}

ll limitingFactor(v &segments)
{
    ll N = 0;
    for (ll x : segments) N += x;
    ll l = 0;
    ll res = 0;
    for (ll x : segments)
    {
        ll r = l + x - 1;
        res += (r - l + 1) * l;
        l += x;
    }
    return res;
}

int main()
{
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    ll N, Q;
    cin >> N >> Q;
    v a(N);
    for (ll i = 0; i < N; i++) cin >> a[i];
    sort(all(a));
    v histogram(maxValue + 1, 0);
    for (ll x : a) histogram[x]++;
    v segments;
    for (ll i = 0; i <= maxValue; i++) if (histogram[i] > 0) segments.pb(histogram[i]);
    sort(all(segments));
    v bestPerm(N); copy(all(segments),bestPerm.begin());
    if (segments.size() == 1)
    {
        cout << evaluate(bestPerm) << "\n";
        return 0;
    }
    ll cur = limitingFactor(segments);
    ll mini = cur;
    double time = 0.9999;
    ll iterations = 10000;
    
    while (iterations--)
    {
        ll i = rand() % (segments.size() - 1);
        swap(segments[i], segments[i + 1]);
        ll newCur = limitingFactor(segments);
        if (newCur < mini) {copy(all(segments),bestPerm.begin()); mini = newCur;}
        if (newCur > cur && (rand() % ((ll)exp((cur - newCur) / time) + 1)) != 0) swap(segments[i], segments[i + 1]);
        else cur = newCur;
        time *= 0.9999;
    }
    cout << evaluate(bestPerm) << "\n";
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 2652 KB Output is correct
2 Correct 1 ms 2652 KB Output is correct
3 Correct 2 ms 2652 KB Output is correct
4 Incorrect 1 ms 2652 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 2652 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 2652 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 2652 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 2652 KB Output is correct
2 Correct 1 ms 2652 KB Output is correct
3 Correct 2 ms 2652 KB Output is correct
4 Incorrect 1 ms 2652 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 2652 KB Output is correct
2 Correct 1 ms 2652 KB Output is correct
3 Correct 2 ms 2652 KB Output is correct
4 Incorrect 1 ms 2652 KB Output isn't correct
5 Halted 0 ms 0 KB -