# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
585499 | 79brue | Ancient Machine (JOI21_ancient_machine) | C++17 | 56 ms | 9568 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "Anna.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
namespace nAnna{
int n;
int arr[100005];
int first0=-1, last2=-1, last1=-1;
bool bits[200005];
ll bitSeq[2002];
ll DP[100][2];
ll calc(vector<bool> v){
assert(v.size() == 63);
ll val = 0;
for(int i=0; i<63; i++){
if(v[i] == 1) val += DP[63-i][0];
}
return val;
}
void Anna(int N, vector<char> _s){
n = N;
for(int i=0; i<n; i++) arr[i] = _s[i] - 'X';
for(int i=0; i<n; i++) if(arr[i] == 0){
first0 = i;
break;
}
if(first0 == -1 || first0 >= n-2) return;
DP[0][0] = 1;
for(int i=1; i<=63; i++){
DP[i][1] = DP[i-1][0];
DP[i][0] = DP[i-1][0] + DP[i-1][1];
}
bool firstBit = (arr[first0+1] == 2);
bits[first0] = 1;
for(int i=first0+2; i<n; i++) if(arr[i] == 2 && arr[i+1] != 2) bits[i] = 1;
for(int i=0; i<n; i+=63){
bitSeq[i/63] = calc(vector<bool> (bits+i, bits+i+63));
}
Send(firstBit);
for(int i=0; i<(n+62)/63; i++) for(int j=0; j<44; j++) Send((bitSeq[i] >> j) & 1);
}
}
void Anna(int N, vector<char> S){
return nAnna::Anna(N, S);
}
#include "Bruno.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
namespace nBruno{
int n, k;
int arr[100002];
bool removed[100002];
vector<int> stk;
int last1;
ll decode[100002];
bool bits[100002];
void remove(int x){
#ifdef TEST
printf("Remove %d\n", x);
#endif // TEST
Remove(x);
removed[x] = 1;
}
ll DP[102][2];
void Bruno(int _n, int _l, vector<int> _vec){
n = _n, k = _l;
if(!k){
for(int i=0; i<n; i++) Remove(i);
return;
}
for(int i=0; i<k; i++) arr[i] = _vec[i];
DP[0][0] = 1;
for(int i=1; i<=63; i++){
DP[i][1] = DP[i-1][0];
DP[i][0] = DP[i-1][0] + DP[i-1][1];
}
// assert(k == 69873);
bool firstBit = _vec[0];
for(int i=1, p=0; i<k; i+=44, p+=63){
for(int j=0; j<44; j++) if(_vec[i+j]) decode[i] += (1LL<<j);
int prv = 0;
for(int j=0; j<63; j++){
if(prv == 1){
prv = 0;
continue;
}
if(decode[i] >= DP[63-j][0]){
decode[i] -= DP[63-j][0];
prv = bits[p+j] = 1;
}
}
}
if(firstBit){
for(int i=0; i<n; i++){
if(bits[i]){
bits[i+1] = 1;
break;
}
}
}
int firstZero = -1;
for(int i=0; i<n; i++){
if(bits[i]){
firstZero = i;
break;
}
}
for(int i=0; i<firstZero; i++) Remove(i);
bits[n-1] = 1;
for(int i=firstZero+1; i<n; i++){
int j = i;
while(!bits[j]) j++;
for(int x=j-1; x>=i; x--) remove(x);
remove(j);
i=j;
}
remove(firstZero);
}
}
void Bruno(int N, int L, vector<int> A){
nBruno::Bruno(N, L, A);
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |