# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1212780 | k1r1t0 | 마술쇼 (APIO24_show) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll setN(int n);
vector<pair<int, int>> Alice() {
///////////////////////////////////////////////////////////////
const int K = 60;
const int T = 83;
const int N = K * T;
const int S = 2341234;
mt19937 rng(S);
vector<int> ord(N);
iota(begin(ord), end(ord), 0);
shuffle(begin(ord), end(ord), rng);
vector<int> bt[K];
for (int i = 0; i < K; i++) {
bt[i].clear();
for (int j = i * T; j < (i + 1) * T; j++)
bt[i].push_back(ord[j]);
}
vector<int> zero(N), one(N);
for (int i = 0; i < N; i++) {
int cnt = i + 2;
zero[i] = rng() % cnt;
one[i] = rng() % (cnt - 1);
if (zero[i] <= one[i]) one[i]++;
zero[i] -= 2;
one[i] -= 2;
}
///////////////////////////////////////////////////////////////
ll X = setN(N + 2);
vector<pair<int, int>> tt;
for (int i = 0; i < K; i++) {
int b = (X >> i) & 1;
for (int j : bt[i]) {
int k = (b == 0 ? zero[j] : one[j]);
tt.push_back({j + 3, k + 3});
}
}
tt.push_back({1, 2});
return tt;
///////////////////////////////////////////////////////////////
}
ll Bob(vector<pair<int, int>> V) {
///////////////////////////////////////////////////////////////
const int K = 60;
const int T = 83;
const int N = K * T;
const int S = 2341234;
mt19937 rng(S);
vector<int> ord(N);
iota(begin(ord), end(ord), 0);
shuffle(begin(ord), end(ord), rng);
vector<int> bt[K];
for (int i = 0; i < K; i++) {
bt[i].clear();
for (int j = i * T; j < (i + 1) * T; j++)
bt[i].push_back(ord[j]);
}
vector<int> zero(N), one(N);
for (int i = 0; i < N; i++) {
int cnt = i + 2;
zero[i] = rng() % cnt;
one[i] = rng() % (cnt - 1);
if (zero[i] <= one[i]) one[i]++;
zero[i] -= 2;
one[i] -= 2;
}
///////////////////////////////////////////////////////////////
int vv[N];
for (int i = 0; i < N; i++)
vv[i] = -3;
for (auto [u, v] : V) {
if (u > v) swap(u, v);
if (v >= 2)
vv[v - 3] = u - 3;
}
ll X = 0;
for (int i = 0; i < K; i++) {
int b = -1;
for (int j : bt[i]) {
if (vv[j] == -3) continue;
if (vv[j] == zero[j]) b = 0;
else b = 1;
break;
}
assert(b != -1);
if (b) X |= (1ll << i);
}
return X;
///////////////////////////////////////////////////////////////
}
/*
void error(const std::string &info){
std::cout << info << std::endl;
exit(0);
}
class AliceGrader{
int n;
long long X;
std::vector<std::pair<int,int>> V;
public:
void Main(){
std::cin >> X;
if(X < 1 || X > 1000000000000000000ll){
error("Error: input value X is invalid.");
}
n = -1;
V = Alice();
if(n == -1){
error("Error: function setN() is not called by function Alice().");
}
if((int) V.size() != n - 1){
error("Error: number of edges returned by Alice() is not n-1.");
}
for(int i = 0;i < n - 1;++i){
if(V[i].first <= 0 || V[i].first > n || V[i].second <= 0 || V[i].second > n){
error("Error: edges returned by Alice() have invalid node.");
}
}
std::cout << n << std::endl;
for(int i = 0;i < n - 1;++i){
std::cout << V[i].first << " " << V[i].second << std::endl;
}
}
long long setN(int N){
if(n != -1){
error("Error: function setN() is called twice by function Alice().");
}
if(N < 2 || N > 5000){
error("Error: value N in function setN() is invalid.");
}
n = N;
return X;
}
}aliceGrader;
class BobGrader{
int n, m;
long long X;
std::vector<std::pair<int,int>> V;
public:
void Main(){
std::cin >> n >> m;
if(n < 2 || n > 5000){
error("Error: input value n is invalid.");
}
if(m < n - 1 - (n - 2) / 2 || m > n - 1){
error("Error: input value m is invalid.");
}
V.resize(m);
for(int i = 0;i < m;++i){
std::cin >> V[i].first >> V[i].second;
if(V[i].first <= 0 || V[i].first > n || V[i].second <= 0 || V[i].second > n){
error("Error: input edges have invalid node.");
}
}
X = Bob(V);
if(X < 1 || X > 1000000000000000000ll){
error("Error: value X returned by Bob() is invalid.");
}
std::cout << X << std::endl;
}
}bobGrader;
long long setN(int N){
return aliceGrader.setN(N);
}
int main(){
int T;
std::cin >> T;
if(T == 1){
aliceGrader.Main();
}
else if(T == 2){
bobGrader.Main();
}
else{
error("Error: input value T is invalid.");
}
return 0;
}
//*/
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll setN(int n);
vector<pair<int, int>> Alice() {
///////////////////////////////////////////////////////////////
const int K = 60;
const int T = 83;
const int N = K * T;
const int S = 2341234;
mt19937 rng(S);
vector<int> ord(N);
iota(begin(ord), end(ord), 0);
shuffle(begin(ord), end(ord), rng);
vector<int> bt[K];
for (int i = 0; i < K; i++) {
bt[i].clear();
for (int j = i * T; j < (i + 1) * T; j++)
bt[i].push_back(ord[j]);
}
vector<int> zero(N), one(N);
for (int i = 0; i < N; i++) {
int cnt = i + 2;
zero[i] = rng() % cnt;
one[i] = rng() % (cnt - 1);
if (zero[i] <= one[i]) one[i]++;
zero[i] -= 2;
one[i] -= 2;
}
///////////////////////////////////////////////////////////////
ll X = setN(N + 2);
vector<pair<int, int>> tt;
for (int i = 0; i < K; i++) {
int b = (X >> i) & 1;
for (int j : bt[i]) {
int k = (b == 0 ? zero[j] : one[j]);
tt.push_back({j + 3, k + 3});
}
}
tt.push_back({1, 2});
return tt;
///////////////////////////////////////////////////////////////
}
ll Bob(vector<pair<int, int>> V) {
///////////////////////////////////////////////////////////////
const int K = 60;
const int T = 83;
const int N = K * T;
const int S = 2341234;
mt19937 rng(S);
vector<int> ord(N);
iota(begin(ord), end(ord), 0);
shuffle(begin(ord), end(ord), rng);
vector<int> bt[K];
for (int i = 0; i < K; i++) {
bt[i].clear();
for (int j = i * T; j < (i + 1) * T; j++)
bt[i].push_back(ord[j]);
}
vector<int> zero(N), one(N);
for (int i = 0; i < N; i++) {
int cnt = i + 2;
zero[i] = rng() % cnt;
one[i] = rng() % (cnt - 1);
if (zero[i] <= one[i]) one[i]++;
zero[i] -= 2;
one[i] -= 2;
}
///////////////////////////////////////////////////////////////
int vv[N];
for (int i = 0; i < N; i++)
vv[i] = -3;
for (auto [u, v] : V) {
if (u > v) swap(u, v);
if (v >= 2)
vv[v - 3] = u - 3;
}
ll X = 0;
for (int i = 0; i < K; i++) {
int b = -1;
for (int j : bt[i]) {
if (vv[j] == -3) continue;
if (vv[j] == zero[j]) b = 0;
else b = 1;
break;
}
assert(b != -1);
if (b) X |= (1ll << i);
}
return X;
///////////////////////////////////////////////////////////////
}
/*
void error(const std::string &info){
std::cout << info << std::endl;
exit(0);
}
class AliceGrader{
int n;
long long X;
std::vector<std::pair<int,int>> V;
public:
void Main(){
std::cin >> X;
if(X < 1 || X > 1000000000000000000ll){
error("Error: input value X is invalid.");
}
n = -1;
V = Alice();
if(n == -1){
error("Error: function setN() is not called by function Alice().");
}
if((int) V.size() != n - 1){
error("Error: number of edges returned by Alice() is not n-1.");
}
for(int i = 0;i < n - 1;++i){
if(V[i].first <= 0 || V[i].first > n || V[i].second <= 0 || V[i].second > n){
error("Error: edges returned by Alice() have invalid node.");
}
}
std::cout << n << std::endl;
for(int i = 0;i < n - 1;++i){
std::cout << V[i].first << " " << V[i].second << std::endl;
}
}
long long setN(int N){
if(n != -1){
error("Error: function setN() is called twice by function Alice().");
}
if(N < 2 || N > 5000){
error("Error: value N in function setN() is invalid.");
}
n = N;
return X;
}
}aliceGrader;
class BobGrader{
int n, m;
long long X;
std::vector<std::pair<int,int>> V;
public:
void Main(){
std::cin >> n >> m;
if(n < 2 || n > 5000){
error("Error: input value n is invalid.");
}
if(m < n - 1 - (n - 2) / 2 || m > n - 1){
error("Error: input value m is invalid.");
}
V.resize(m);
for(int i = 0;i < m;++i){
std::cin >> V[i].first >> V[i].second;
if(V[i].first <= 0 || V[i].first > n || V[i].second <= 0 || V[i].second > n){
error("Error: input edges have invalid node.");
}
}
X = Bob(V);
if(X < 1 || X > 1000000000000000000ll){
error("Error: value X returned by Bob() is invalid.");
}
std::cout << X << std::endl;
}
}bobGrader;
long long setN(int N){
return aliceGrader.setN(N);
}
int main(){
int T;
std::cin >> T;
if(T == 1){
aliceGrader.Main();
}
else if(T == 2){
bobGrader.Main();
}
else{
error("Error: input value T is invalid.");
}
return 0;
}
//*/