# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1078451 | raphaelp | Broken Device (JOI17_broken_device) | C++14 | 0 ms | 0 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 "Annalib.h"
#include <bits/stdc++.h>
using namespace std;
void Anna(int N, long long X, int K, int P[])
{
vector<int> P2(N);
for (int i = 0; i < K; i++)
P2[P[i]] = 1;
vector<int> bits;
while (X)
{
bits.push_back(X % 2);
X /= 2;
}
int M = bits.size();
reverse(bits.begin(), bits.end());
vector<vector<pair<int, int>>> dp(N + 5, vector<pair<int, int>>(M + 1));
vector<int> ans(N, 0);
dp[0][0].first = 1;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
if (dp[i][j].first)
{
dp[i + 1][j].first = 1;
if (bits[j] == 0 && P2[i] == 0)
{
dp[i + 2][j + 1].first = 2;
}
if (bits[j] == 1 && i < N - 1 && P2[i] == 0 && P2[i + 1] == 0)
{
dp[i + 3][j + 1].first = 3;
}
if (i < N - 2 && P2[i] == 0 && P2[i + 1] == 0 && P2[i + 2] == 0)
{
dp[i + 4][j].second = 4;
}
}
if (dp[i][j].second)
{
dp[i + 1][j].second = 1;
if (bits[j] == 1 && P2[i] == 0)
{
dp[i + 2][j + 1].second = 2;
}
if (bits[j] == 0 && i < N - 1 && P2[i] == 0 && P2[i + 1] == 0)
{
dp[i + 3][j + 1].second = 3;
}
if (i < N - 2 && P2[i] == 0 && P2[i + 1] == 0 && P2[i + 2] == 0)
{
dp[i + 4][j].first = 4;
}
}
}
}
int x = N + 3;
while (true)
{
if (x == -1)
break;
if (dp[x][M].first)
break;
if (dp[x][M].second)
{
x += 200;
break;
}
x--;
}
int y = M;
while (x > 0)
{
if (x >= 200)
{
x -= 200;
int temp = dp[x][y].second;
x--;
for (int i = 1; i < temp; i++)
{
x--;
ans[x] = 1;
}
if (temp == 2 || temp == 3)
y--;
if (temp < 4)
x += 200;
}
else
{
int temp = dp[x][y].first;
x--;
for (int i = 1; i < temp; i++)
{
x--;
ans[x] = 1;
}
if (temp == 2 || temp == 3)
y--;
if (temp == 4)
x += 200;
}
}
for (int i = 0; i < N; i++)
{
//cout << ans[i] << ' ';
Set(i, ans[i]);
}
}
/*int main()
{
long long N, X, K;
cin >> N >> X >> K;
int P[N];
srand(time(0));
for (int i = 0; i < K; i++)
P[i] = rand() % N;
Anna(N, X, K, P);
}*/