답안 #209713

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
209713 2020-03-15T11:40:51 Z Alexa2001 Shuffle (NOI19_shuffle) C++17
52 / 100
18 ms 8564 KB
#include "shuffle.h"
#include <bits/stdc++.h>

using namespace std;

const int Nmax = 1005;


int b, k, n, one, Nr;

vector<vector<int>> query[15], ans1, ans2, ans3, to0, W[15];
vector<int> cycle;

int marked[Nmax][Nmax], on_cycle[Nmax];
int marked1[Nmax], marked2[Nmax], val[Nmax];



void step1()
{
    vector<int> aux;
    vector<vector<int>> to1, to2;

    int i, j;
    for(i=1; i<=b; ++i)
    {
        aux.clear();
        for(j=i*k-k+1; j<=i*k; ++j)
            aux.push_back(j);

        to1.push_back(aux);
    }

    ans1 = query[1] = shuffle(to1);

    for(i=1; i<b; ++i)
    {
        aux.clear();
        for(j=i*k-k+2; j<=i*k+1; ++j)
            aux.push_back(j);
        to2.push_back(aux);
    }

    aux.clear();
    aux.push_back(1);
    for(i=n-k+2; i<=n; ++i) aux.push_back(i);
    to2.push_back(aux);

    ans2 = shuffle(to2);

    aux.clear();
    aux.push_back(1);
    for(i=k+2; i<=2*k; ++i) aux.push_back(i);

    to0 = to1;
    to1[0] = aux;
    to1[1] = to2[0];

    ans3 = shuffle(to1);

    for(auto it : ans1)
        for(auto x : it)
            for(auto y : it)
                marked[x][y] ++, marked1[x] = max(marked1[x], x!=y ? y : 0);

    for(auto it : ans2)
        for(auto x : it)
            for(auto y : it)
                marked[x][y] ++, marked2[x] = max(marked2[x], x!=y ? y : 0);

    for(i=1; i<=n; ++i)
    {
        bool ok = 1;
        for(j=1; ok && j<=n; ++j)
            if(i != j && marked[i][j] > 1)
                ok = 0;
        if(ok) on_cycle[i] = 1;
    }

    for(auto it : ans3)
        for(auto x : it)
            for(auto y : it)
                marked[x][y] ++;

    for(i=1; i<=n; ++i)
    {
        bool ok = 1;
        for(j=1; ok && j<=n; ++j)
            if(i != j && marked[i][j] > 1)
                ok = 0;
        if(ok) one = i;
    }

    cycle.push_back(one);

    while(cycle.size() < b)
    {
        for(i=1; i<=n; ++i)
            if(on_cycle[i] && marked1[cycle.back()] == marked2[i])
            {
                cycle.push_back(i);
                break;
            }
    }

    for(i=0; i<b; ++i) val[cycle[i]] = i * k + 1;
}

void divide(vector<vector<int>> &to)
{
    bool ok = 0;
    int i, j;
    for(auto it : to)
        if(it.size() > 1) ok = 1;

    if(!ok) return;

    vector<vector<int>> w;

    for(auto it : to)
    {
        int cat, rest;
        cat = it.size() / b;
        rest = it.size() % b;

        int id = 0;

        for(i=0; i<b; ++i)
        {
            vector<int> aux;

            for(j=0; j<cat; ++j)
                aux.push_back(it[id++]);

            if(i < rest) aux.push_back(it[id++]);

            w.push_back(aux);
        }
    }

    vector<vector<int>> q;

    for(i=0; i<b; ++i)
    {
        int rest;
        int C = w.size() / b, id;

        vector<int> aux;

        for(j=0, rest = i; j<b; ++j, rest = (rest+1) % b)
        {
            for(id = C * j + rest; id < C * (j+1); id += b)
                for(auto it : w[id])
                    aux.push_back(it);
        }

        q.push_back(aux);
    }

    W[++Nr] = q;
    query[++Nr] = shuffle(q);

    divide(w);
}

vector<int> solve6()
{
    W[Nr = 1] = to0;
    divide(to0);


    vector<int> where(1e6 + 5, -1);
    vector<int> who(n+1, 0), whoo(n+1, 0);


    int i;
    for(i=1; i<=Nr; ++i)
        for(auto it : query[i])
        {
            int rep;
            for(auto x : it)
                if(on_cycle[x]) rep = val[x] / k;

            for(auto x : it)
                who[x] = who[x] * b + rep;
        }


    for(i=1; i<=n; ++i)
        where[who[i]] = i;


    for(auto itt : W)
        for(auto it : itt)
        {
            int rep;
            for(auto x : it)
                if(x % k == 1) rep = x / k;

            for(auto x : it)
                whoo[x] = whoo[x] * b + rep;
        }

    vector<int> p(n);

    for(i=1; i<=n; ++i)
        p[i-1] = where[whoo[i]];

    return p;
}

vector<int> solve(int N, int B, int K, int Q, int ST)
{
    n = B * K;
    b = B;
    k = K;

    if(ST != 6) return vector<int> ();

    step1();
    return solve6();
}

Compilation message

shuffle.cpp: In function 'void step1()':
shuffle.cpp:96:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     while(cycle.size() < b)
           ~~~~~~~~~~~~~^~~
shuffle.cpp: In function 'std::vector<int> solve6()':
shuffle.cpp:201:39: warning: 'rep' may be used uninitialized in this function [-Wmaybe-uninitialized]
                 whoo[x] = whoo[x] * b + rep;
shuffle.cpp:185:37: warning: 'rep' may be used uninitialized in this function [-Wmaybe-uninitialized]
                 who[x] = who[x] * b + rep;
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 376 KB Wrong Answer. Returned result not of length 6.
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 376 KB Wrong Answer. Returned result not of length 6.
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 376 KB Wrong Answer. Returned result not of length 999.
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 376 KB Wrong Answer. Returned result not of length 1000.
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 376 KB Wrong Answer. Returned result not of length 1000.
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 4728 KB Output is correct
2 Correct 9 ms 6392 KB Output is correct
3 Correct 10 ms 6264 KB Output is correct
4 Correct 15 ms 8564 KB Output is correct
5 Correct 10 ms 8112 KB Output is correct
6 Correct 14 ms 8436 KB Output is correct
7 Correct 11 ms 8312 KB Output is correct
8 Correct 9 ms 5500 KB Output is correct
9 Correct 10 ms 8172 KB Output is correct
10 Correct 9 ms 6912 KB Output is correct
11 Correct 18 ms 8536 KB Output is correct
12 Correct 14 ms 8564 KB Output is correct
13 Correct 16 ms 8536 KB Output is correct
14 Correct 10 ms 8312 KB Output is correct
15 Correct 9 ms 5880 KB Output is correct
16 Correct 15 ms 8436 KB Output is correct
17 Correct 8 ms 4472 KB Output is correct
18 Correct 13 ms 8052 KB Output is correct
19 Correct 8 ms 5752 KB Output is correct
20 Correct 12 ms 8120 KB Output is correct