Submission #1327897

#TimeUsernameProblemLanguageResultExecution timeMemory
1327897idonoamRotating Lines (APIO25_rotate)C++20
100 / 100
35 ms2400 KiB
#include "rotate.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
/*
static int total_cost = 0;

static std::vector<int> v;

static FILE *file_log;

static void fprintf_vector(std::vector<int> vec)
{
    fprintf(file_log, "[");
    for (int i = 0; i < (int)vec.size(); i++)
    {
        if (i > 0)
            fprintf(file_log, ", ");
        fprintf(file_log, "%d", vec[i]);
    }
    fprintf(file_log, "]");
}

static long long calc_energy()
{
    long long res = 0;
    for (int i = 0; i < (int)v.size(); i++)
    {
        for (int j = i + 1; j < (int)v.size(); j++)
        {
            int d = abs(v[i] - v[j]);
            res += std::min(d, 50000 - d);
        }
    }
    return res;
}

static long long last_energy;

void rotate(std::vector<int> t, int x)
{
    int k = (int)t.size();
    total_cost += k;

    if (total_cost > 2000000)
    {
        printf("Too many rotations\n");
        exit(0);
    }

    std::set<int> seen;
    for (int i = 0; i < k; i++)
    {
        if (t[i] < 0 || t[i] >= (int)v.size())
        {
            printf("Invalid index\n");
            exit(0);
        }
        if (seen.find(t[i]) != seen.end())
        {
            printf("t has duplicate element\n");
            exit(0);
        }
        v[t[i]] = (v[t[i]] + x) % 50000;
        seen.insert(t[i]);
    }

    fprintf(file_log, "rotate(");
    fprintf_vector(t);
    fprintf(file_log, ", %d)\n", x);

    fprintf(file_log, "v <- ");
    fprintf_vector(v);
    fprintf(file_log, "\n");

    long long cur_energy = calc_energy();
    fprintf(file_log, "New energy: %lld\n", cur_energy);
    fprintf(file_log, "\n");

    if (cur_energy < last_energy)
    {
        printf("Energy decreased\n");
        exit(0);
    }

    last_energy = cur_energy;
}
*/
void energy(int n, std::vector<int> v)
{
    vector<pair<int, int>> vec(n);
    for (int i = 0; i < n; i++)
        vec[i] = {v[i], i};
    sort(vec.begin(), vec.end());
    for (int i = 0; i < n / 2; i++)
    {
        if (vec[i].first + 25000 - vec[i + (n + 1) / 2].first != 0)
            rotate({vec[i + (n + 1) / 2].second}, vec[i].first + 25000 - vec[i + (n + 1) / 2].first);
    }
}
/*
int main()
{
    int n;
    scanf("%d", &n);

    v.resize(n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &v[i]);
    }

    last_energy = calc_energy();

    file_log = fopen("log.txt", "w");
    fprintf(file_log, "Initial energy: %lld\n\n", last_energy);

    energy(n, v);

    fclose(file_log);

    printf("%lld\n", calc_energy());

    return 0;
}
    /* */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...