제출 #1007473

#제출 시각아이디문제언어결과실행 시간메모리
1007473FaggiData Transfer (IOI19_transfer)C++14
100 / 100
221 ms2520 KiB
#include <bits/stdc++.h>
#define SIZE(x) int(x.size())
using namespace std;
std::vector<int> get_attachment(std::vector<int> source)
{
    vector<int>cal;
    vector<int>ag, ag2;
    int pot=1, i, pos=0,cP=0, j, un;
    for(i=0; pos<SIZE(source); i++)
    {
        if(i+1==pot)
        {
            pot*=2;
            cP++;
            cal.push_back(2);
        }
        else
        {
            cal.push_back(source[pos]);
            pos++;
        }
    }
    pot=1;
    for(i=0; i<cP; i++)
    {
        un=0;
        for(j=pot-1; j<SIZE(cal); j++)
        {
            if((j+1)&pot)
            {
                if(cal[j]==1)
                    un++;
            }
        }
        if(un%2==0)
            ag.push_back(0);
        else
            ag.push_back(1);
        pot*=2;

    }
    for(i=SIZE(ag)-1; i>=0; i--)
    {
        ag2.push_back(ag[i]);
    }
    return ag2;
}

std::vector<int> retrieve(std::vector<int> data)
{
    vector<int>ret(SIZE(data)), comp(SIZE(data)), ag, ag2;
    int pot=1, pos=0, i, cP=0, j, un;
    for(i=0; i<SIZE(ret); i++)
    {
        if(i+1==pot)
        {
            ret[i]=data[SIZE(data)-1];
            comp[i]=2;
            cP++;
            ag2.push_back(ret[i]);
            data.pop_back();
            pot*=2;
        }
        else
        {
            ret[i]=data[pos];
            comp[i]=ret[i];
            pos++;
        }
    }
    pot=1;
    for(i=0; i<cP; i++)
    {
        un=0;
        for(j=pot-1; j<SIZE(comp); j++)
        {
            if((j+1)&pot)
            {
                if(comp[j]==1)
                    un++;
            }
        }
        if(un%2==0)
            ag.push_back(0);
        else
            ag.push_back(1);
        pot*=2;

    }
    vector<bool>bus(cP,1);
    for(i=0; i<SIZE(ag); i++)
    {
        if(ag[i]!=ag2[i])
        {
            bus[i]=0;
        }
    }
    pot=1;
    int arr=0;
    for(auto k:bus)
    {
        if(k==0)
        {
            arr=arr|pot;
        }
        pot*=2;
    }
    for(i=0; i<SIZE(ret); i++)
    {
        if(i+1==arr)
        {
            ret[i]=!ret[i];
        }
    }
    vector<int>ans;
    pot=1;
    for(i=0; i<SIZE(ret); i++)
    {
        if(i+1==pot)
        {
            pot*=2;
        }
        else
        {
            ans.push_back(ret[i]);
        }
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...