제출 #1169109

#제출 시각아이디문제언어결과실행 시간메모리
1169109wojtekmalPainting Squares (IOI20_squares)C++20
100 / 100
27 ms540 KiB
#include <bits/stdc++.h>
#include "squares.h"
using namespace std;

bool graph_made = false;
array<int, 1024> graph;
array<int, 1024> node_to_cycle;
vector<set<int>> cycles;
array<bool, 1024> visited;
array<int, 1024> node_to_pos;

void make_graph()
{
    graph_made = true;
    for (int i = 512; i < 1024; i++) graph[i] = 1;
    int cycle_count = 0;

    for (int i = 0; i < 1024; i++)
    {
        if (visited[i]) continue;
        set<int> cycle;

        for (int node = i; !visited[node]; node = (node << 1) & 1023 | graph[node])
        {
            visited[node] = true;
            cycle.insert(node);
            node_to_cycle[node] = cycle_count;
        }

        cycles.push_back(cycle);
        cycle_count++;
    }

    for (int i = 0; i < 1024; i++)
    {
        if (node_to_cycle[i] != node_to_cycle[i ^ 512])
        {
            graph[i] ^= 1;
            graph[i ^ 512] ^= 1;
            int new_cycle = node_to_cycle[i];
            int old_cycle = node_to_cycle[i ^ 512];

            for (int node : cycles[old_cycle])
            {
                cycles[new_cycle].insert(node);
                node_to_cycle[node] = new_cycle;
            }
        }
    }

    int pos = 0;

    for (int node = 0; pos < 1024; pos++)
    {
        node_to_pos[node] = pos;
        node = (node << 1) & 1023 | graph[node];
    }
}

vector<int> paint(int n)
{
    if (!graph_made) make_graph();
    vector<int> answer(n + 1);

    int pos = 0;

    for (; pos < 10 && pos < n; pos++) answer[pos] = 0;

    for (int node = 0; pos < n; pos++)
    {
        answer[pos] = graph[node];
        node = (node << 1) & 1023 | graph[node];
    }

    answer[n] = 10;

    return answer;
}

int find_location(int n, vector<int> c)
{
    if (!graph_made) make_graph();

    for (int i = 0; i < 10; i++)
    {
        if (c[i] == -1) return n - i;
    }

    int node = 0;
    for (int i = 0; i < 10; i++) node += c[i] * (1 << (9 - i));
    return node_to_pos[node];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...