| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1334112 | QuocSensei | Data Transfer (IOI19_transfer) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#define ll long long
#define el cout << endl
#define ii pair<int, int>
#define fi first
#define se second
#define BIT(n) ((1ll) << (n))
#define bit(mask, i) (((mask) >> (i)) & 1)
using namespace std;
namespace SUBTASK_1
{
namespace personA
{
vector<int> get_attachment(vector<int> source)
{
int N = source.size();
vector<int> data;
for (int i = 0; i < N; i++)
{
data.push_back(source[i]);
data.push_back(source[i]);
}
return data;
}
}
namespace personB
{
vector<int> retrieve(vector<int> data)
{
int N = data.size() / 3;
vector<int> ans;
for (int i = 0; i < N; i++)
{
vector<int> v0 = {0, 0};
vector<int> v1 = {0, 1};
for (int x : {i, N + 2 * i, N + 2 * i + 1})
{
v0[0] += data[x] == 0;
v1[0] += data[x] == 1;
}
ans.push_back(max(v0, v1)[1]);
}
return ans;
}
}
}
namespace SUBTASK_2
{
namespace personA
{
vector<int> get_attachment(vector<int> source)
{
int N = source.size();
vector<int> data;
for (int i = 0, pre = 0; i <= N; i++)
{
if (i < N)
pre ^= source[i];
data.push_back(pre);
}
return data;
}
}
namespace personB
{
vector<int> retrieve(vector<int> data)
{
int N = data.size() - 1 >> 1;
vector<int> ans;
bool flag = 0;
for (int i = 0, pre = 0; i < N; i++)
{
ans.push_back(data[i]);
pre ^= data[i];
int nxt_data = i + 1 < N ? data[i + 1] : 0;
if (pre != data[i + N] && (pre ^ nxt_data) != data[i + N + 1] && !flag)
{
ans[i] ^= 1;
flag = 1;
}
}
return ans;
}
}
}
namespace SUBTASK_AC
{
namespace personA
{
vector<int> get_attachment(vector<int> source)
{
int N = source.size();
int maxlog = __lg(N) + 1;
vector<int> ans;
int x = 0;
for (int i = 1; i <= N; i++)
if (source[i - 1])
x ^= i;
for (int i = maxlog - 1; i >= 0; i--)
ans.push_back(bit(x, i));
ans.push_back(__builtin_popcount(x) & 1);
return ans;
}
}
namespace personB
{
vector<int> retrieve(vector<int> data)
{
int N = data.size() - maxlog - 1;
int maxlog = ___lg(N) + 1;
vector<int> ans;
int sum = 0, x = 0;
for (int i = 0; i < N; i++)
{
ans.push_back(data[i]);
if (ans[i])
sum ^= i + 1;
}
for (int i = 0; i < maxlog; i++)
x += BIT(maxlog - i - 1) * data[i + N];
if ((__builtin_popcount(x) & 1) != data.back())
return ans;
for (int i = 1; i <= N; i++)
if ((sum ^ i) == x)
ans[i - 1] ^= 1;
return ans;
}
}
}
vector<int> get_attachment(vector<int> source)
{
return SUBTASK_AC::personA::get_attachment(source);
}
vector<int> retrieve(vector<int> data)
{
return SUBTASK_AC::personB::retrieve(data);
}