# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
931186 | boris_mihov | Ancient Machine (JOI21_ancient_machine) | C++17 | 39 ms | 8148 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "Anna.h"
#include <algorithm>
#include <iostream>
#include <cassert>
#include <vector>
typedef long long llong;
const int BUCKET_SIZE = 77;
const int MYLOG = 54;
llong fib[BUCKET_SIZE + 5];
struct FibbonacciConverter
{
std::string getString(std::string s)
{
while (s.size() % BUCKET_SIZE != 0)
{
s += '0';
}
// std::cout << "send: " << s << '\n';
std::string res;
for (int i = 0 ; i < s.size() ; i += BUCKET_SIZE)
{
llong currNum = 0;
for (int j = i ; j < i + BUCKET_SIZE ; ++j)
{
// if (j != i) assert(s[j] == '0' || s[j - 1] == '0');
if (s[j] == '1') currNum += fib[j - i];
assert(currNum < (1LL << MYLOG));
}
// std::cout << "num is: " << currNum << '\n';
for (int log = MYLOG - 1 ; log >= 0 ; --log)
{
if (currNum & (1LL << log))
{
res += '1';
} else
{
res += '0';
}
}
}
return res;
}
std::string fromString(std::string s)
{
assert(s.size() % MYLOG == 0);
std::string res;
for (int i = 0 ; i < s.size() ; i += MYLOG)
{
llong currNum = 0;
for (int j = i ; j < i + MYLOG ; ++j)
{
currNum *= 2;
if (s[j])
{
currNum++;
}
}
std::string toAdd;
for (int pos = BUCKET_SIZE ; pos > 0 ; --pos)
{
if (currNum >= fib[pos - 1])
{
toAdd += '1';
currNum -= fib[pos - 1];
} else
{
toAdd += '0';
}
}
std::reverse(toAdd.begin(), toAdd.end());
res += toAdd;
}
return res;
}
};
void Anna(int N, std::vector <char> s)
{
fib[0] = 1;
fib[1] = 2;
fib[2] = 4;
for (int i = 3 ; i < BUCKET_SIZE + 5 ; ++i)
{
fib[i] = fib[i - 1] + fib[i - 2];
}
std::string res;
bool foundX = false;
int xPos = -2;
for (int i = 0 ; i < N ; ++i)
{
if (!foundX && s[i] == 'X')
{
xPos = i;
foundX = true;
res += '1';
// std::cout << i << '\n';
} else if (foundX && s[i] == 'Z' && (i == xPos + 1 || (res.back() == '0' && (i + 1 == N || s[i + 1] != 'Z'))))
{
// std::cout << i << '\n';
res += '1';
} else
{
// assert(!foundX || s[i - 1] == 'X' || s[i] != 'Z' || (i + 1 < N && s[i + 1] == 'Z'));
res += '0';
}
}
// std::cout << "Res before: " << res << '\n';
FibbonacciConverter converter;
res = converter.getString(res);
// std::cout << "res: " << res.size() << '\n';
for (int i = 0 ; i < res.size() ; ++i)
{
Send(res[i] - '0');
}
}
#include "Bruno.h"
#include <algorithm>
#include <iostream>
#include <cassert>
#include <vector>
typedef long long llong;
const int MAXN = 100000 + 10;
const int BUCKET_SIZE = 77;
const int MYLOG = 54;
llong fibB[BUCKET_SIZE + 5];
struct FibbonacciConverterB
{
std::string getString(std::string s)
{
while (s.size() % BUCKET_SIZE != 0)
{
s += '0';
}
std::string res;
for (int i = 0 ; i < s.size() ; i += BUCKET_SIZE)
{
llong currNum = 0;
for (int j = i ; j < i + BUCKET_SIZE ; ++j)
{
if (s[j] == '1') currNum += fibB[j - i];
}
// whk(currNum < (1LL << MYLOG));
for (int log = MYLOG - 1 ; log >= 0 ; --log)
{
if (currNum & (1LL << log))
{
res += '1';
} else
{
res += '0';
}
}
}
return res;
}
std::string fromString(std::string s)
{
assert(s.size() % MYLOG == 0);
std::string res;
for (int i = 0 ; i < s.size() ; i += MYLOG)
{
llong currNum = 0;
for (int j = i ; j < i + MYLOG ; ++j)
{
currNum *= 2;
if (s[j] == '1')
{
currNum++;
}
}
// std::cout << "curr num is: " << currNum << '\n';
std::string toAdd;
for (int pos = BUCKET_SIZE ; pos > 0 ; --pos)
{
if (currNum >= fibB[pos - 1])
{
toAdd += '1';
currNum -= fibB[pos - 1];
} else
{
toAdd += '0';
}
}
std::reverse(toAdd.begin(), toAdd.end());
res += toAdd;
}
return res;
}
};
void Bruno(int N, int L, std::vector <int> A)
{
fibB[0] = 1;
fibB[1] = 2;
fibB[2] = 4;
for (int i = 3 ; i < BUCKET_SIZE + 5 ; ++i)
{
fibB[i] = fibB[i - 1] + fibB[i - 2];
}
std::string res;
for (int i = 0 ; i < L ; ++i)
{
res += '0' + A[i];
}
FibbonacciConverterB converter;
std::string s = converter.fromString(res);
// std::string s = res;
// std::cout << "receive: " << s << '\n';
int xPos = -1;
int added = 0;
std::vector <int> pos;
for (int i = 0 ; i < L ; ++i)
{
if (s[i] == '1')
{
if (xPos == -1) xPos = i;
// std::cout << "here: " << i << '\n';
pos.push_back(i);
}
}
if (pos.empty())
{
for (int i = 0 ; i < N ; ++i)
{
Remove(i);
}
return;
}
if (pos.back() < N - 1) pos.push_back(N - 1);
for (int i = 0 ; i < xPos ; ++i)
{
Remove(i);
}
for (int i = 1 ; i < pos.size() ; ++i)
{
for (int j = pos[i] - 1 ; j > pos[i - 1] ; --j)
{
Remove(j);
}
Remove(pos[i]);
}
Remove(pos[0]);
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |