# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
308004 | kimjg1119 | Data Transfer (IOI19_transfer) | C++17 | 318 ms | 2788 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "transfer.h"
#include <bits/stdc++.h>
using namespace std;
vector<int> get_attachment_sub1(vector<int> sc) {
int a[10] = {};
for (int i = 0; i < sc.size(); i++) {
for (int j = 0; j < 6; j++)
if(sc[i]) a[j] ^= (i + 1) & (1 << j);
}
vector<int> r;
for (int i = 0; i < 6; i++)
if (a[i]) r.push_back(1);
else r.push_back(0);
vector<int> at;
for (int i = 0; i < 1; i++) {
for (int j = 0; j < 6; j++)
at.push_back(r[j]);
}
int s = 0;
for (int i = 0; i < 6; i++) s += r[i];
at.push_back(s % 2);
return at;
}
vector<int> get_attachment_sub2(vector<int> sc) {
int a[10] = {};
for (int i = 0; i < sc.size(); i++) {
for (int j = 0; j < 8; j++)
if (sc[i]) a[j] ^= (i + 1) & (1 << j);
}
vector<int> r;
for (int i = 0; i < 8; i++)
if (a[i]) r.push_back(1);
else r.push_back(0);
vector<int> at;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 8; j++)
at.push_back(r[j]);
}
return at;
}
std::vector<int> get_attachment(std::vector<int> source) {
if (source.size() == 63) return get_attachment_sub1(source);
else return get_attachment_sub2(source);
}
vector<int> retrieve_sub1(vector<int> d) {
vector<int> t1;
for (int i = 0; i < 7; i++) t1.push_back(d[i+63]);
for (int i = 0; i < 7; i++) d.pop_back();
int p = t1.back(); t1.pop_back();
bool flag = true; int ts = 0;
for (int i = 0; i < 6; i++) ts += t1[i];
if (ts % 2 != p) flag = false;
if (flag) {
int a[10] = {};
for (int i = 0; i < d.size(); i++) {
for (int j = 0; j < 6; j++)
if (d[i]) a[j] ^= (i+1) & (1 << j);
}
int r = 0;
for (int i = 0; i < 6; i++) a[i] ^= t1[i] * (1<<i);
for (int i = 0; i < 6; i++)
if (a[i]) r |= (1 << i);
if (r > 0) d[r - 1] = 1 - d[r - 1];
return d;
}
else return d;
}
vector<int> retrieve_sub2(vector<int> d) {
vector<int> t, t1, t2;
for (int i = 255; i < d.size(); i++) t.push_back(d[i]);
for (int i = 0; i < 16; i++) d.pop_back();
for (int i = 0; i < 8; i++) t1.push_back(t[i]);
for (int i = 0; i < 8; i++) t2.push_back(t[i + 8]);
bool flag = true;
for (int i = 0; i < 8; i++)
if (t1[i] != t2[i]) flag = false;
if (flag) {
int a[10] = {};
for (int i = 0; i < d.size(); i++) {
for (int j = 0; j < 8; j++)
if (d[i]) a[j] ^= (i + 1) & (1 << j);
}
int r = 0;
for (int i = 0; i < 8; i++) a[i] ^= t1[i] * (1 << i);
for (int i = 0; i < 8; i++)
if (a[i]) r |= (1 << i);
if (r > 0) d[r - 1] = 1 - d[r - 1];
return d;
}
else return d;
}
std::vector<int> retrieve(std::vector<int> data) {
if (data.size() < 255) return retrieve_sub1(data);
else return retrieve_sub2(data);
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |