Submission #1209516

#TimeUsernameProblemLanguageResultExecution timeMemory
1209516LudisseyRotating Lines (APIO25_rotate)C++20
13 / 100
3096 ms11244 KiB
#include "rotate.h"
#include <bits/stdc++.h>
#define int long long
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()

using namespace std;

vector<int> pos;
const int HALF=50000;
const int ACUT=25000;

int calc(){
    long long res = 0;
    for (int i = 0; i < sz(pos); i++){
        for (int j = i + 1; j <  sz(pos); j++){
            int d=abs(pos[i]-pos[j]);
            res+=min(d, HALF-d);
        }
    }
    return res;
}
int eg=0;
map<int,int> mp;
void change(){
    for (int i = 0; i < sz(pos); i++)
    {
        if(mp[pos[i]]==0) continue;
        for (int j = 0; j < sz(pos); j++)
        {
            if(i==j) continue;
            if(mp[pos[j]]==0) continue;
            int p=pos[i];
            pos[i]=(pos[j]+ACUT)%HALF;
            int c=calc();
            if(eg<=c){
                eg=c;
                mp[p]--;
                mp[pos[j]]--;
                int df=(pos[i]-p);
                if(df<0) df+=HALF;
                rotate({(signed)i},(signed)df);
                return;
            }
            pos[i]=p;
        }
    }
}

void energy(signed n, std::vector<signed> v){
    for (int i = 0; i < sz(v); i++) pos.push_back(v[i]);
    eg=calc();
    int rs=n;
    for (int i = 0; i < sz(pos); i++) mp[pos[i]]++;
    for (int i = 0; i < sz(pos); i++)
    {
        if(mp[pos[i]]==0) continue;
        if(mp[(pos[i]+ACUT)%HALF]>0) {
            mp[pos[i]]--;
            mp[(pos[i]+ACUT)%HALF]--;
            rs-=2;
        }
    }
    while (rs>1)
    {
        change();
        rs-=2;
    }
    while(eg!=((n/2)*((n+1)/2))*ACUT){
        cerr << "NO";
    }
}
#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...