Link
I felt you need more invetiveness/creativeness in this contest, and it was difficult.
A – Shik and Stone
Compared to ARC (regular contest), it is slightly difficult even from problem A.
The most elegant solution is to just check the number of ‘#’ is equal to \(W+H−1\) or not as explained in Editorial.
However, I could not notice it so I checked that we can actually go using only right or down or not.
/*
* AC 3 ms 256 KB
*/
#include <cstdio>
#include <iostream>
using namespace std;
char a[8][9];
int main(){
//freopen("a3.in", "r", stdin);
int h, w;
scanf("%d %d", &h, &w);
for (int i = 0; i < h; ++i) {
scanf("%s", &a[i]);
}
int curH = 0, curW = 0;
while (curH != h-1 || curW != w-1) {
a[curH][curW] = '.';
if (curH+1 < h && a[curH+1][curW] == '#') {curH++;}
else if (curW+1 < w && a[curH][curW+1] == '#') {curW++;}
else break;
}
a[curH][curW] = '.';
bool ans = true;
for (int i = 0; i < h; ++i) {
for (int j = 0; j < w; ++j) {
if (a[i][j] == '#') ans = false;
}
}
printf(ans ? "Possible\n" : "Impossible\n");
return 0;
}
B – Construct Sequences
You need to come up with one construction method which satisfies the 3 conditions.
Editorial way is much more easier than below construction.
/*
* AC 10 ms 896 KB
*/
#include <cstdio>
#include <iostream>
using namespace std;
int p[20005];
int q[20005];
int a[20005], b[20005];
int main(){
//freopen("b3.in", "r", stdin);
int n;
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &p[i]);
q[p[i]] = i;
}
int lsum = 1, rsum = 1;
for (int i = 1; i <= n; ++i) {
lsum += q[i];
a[i] = lsum + i;
}
for (int i = n; i > 0; --i) {
rsum += q[i];
b[i] = rsum + (n+1-i);
}
for (int i = 1; i <= n; ++i) {
printf("%d%c", a[i], i == n ? '\n' : ' ');
}
for (int i = 1; i <= n; ++i) {
printf("%d%c", b[i], i == n ? '\n' : ' ');
}
return 0;
}
C – Pushing Balls
Since most of the participants could not solve it, I’ll skip this.
D – Shik and Game
This algorithm takes \(O(N^2)\), which pass only 600 points.
/*
*
*/
#include <cstdio>
#include <iostream>
#define INF 1000000000000000LL
using namespace std;
typedef long long ll;
ll x[100005];
ll dp[100005]; // dp[i]: minimum time until the exit
// after you get coin at i-th place and you haven't feed to the rest yet.
int main(){
//freopen("d2.in", "r", stdin);
int N, E, T;
scanf("%d %d %d", &N, &E, &T);
x[0] = 0;
for (int i = 1; i <= N; ++i) {
scanf("%lli", &x[i]);
}
dp[N] = E - x[N];
//cout << "N = " << N << ", dp[N]= " << dp[N] << endl;
for (int i = N - 1; i >= 0; --i) {
dp[i] = INF;
for (int j = i + 1; j <= N; ++j) {
if ((2 * (x[j] - x[i+1])) > T) {
dp[i] = min(dp[i], dp[j] + 3 * (x[j] - x[i+1]) + (x[i+1] - x[i]));
} else {
dp[i] = min(dp[i], dp[j] + (x[j] - x[i+1]) + T + (x[i+1] - x[i]));
}
}
//cout << "i = " << i << ", dp[i]= " << dp[i] << endl;
}
printf("%lli\n", dp[0]);
return 0;
}