Codeforces Round #378 (Div. 2), Problem: (C) Epidemic in Monstropolis Solution in C

Hi guys , i just tried the Epidemic in Monstropolis problem , hope you might like it .

#include
#include

#define MAXN 500
int a[MAXN];
int b[MAXN];
int partial_sums[MAXN];
unsigned char d[MAXN + 1][MAXN + 1];
unsigned char equals[MAXN + 1][MAXN + 1];
int ans[MAXN + 1][MAXN + 1];
int n, k;
int i, j, r, t;

int dif[2];
int order[2];
char symbol[2];

int main(int argc, char *argv[]) {

#ifndef ONLINE_JUDGE
freopen(“input.txt”, “r”, stdin);
//freopen(“output.txt”, “w”, stdout);
#endif
// read and init data
scanf(“%d”, &n);
for (i = 0; i < n; ++i) {
scanf(“%d”, &a[i]);
}

scanf(“%d”, &k);
for (i = 0; i < k; ++i) {
scanf(“%d”, &b[i]);
}

partial_sums[0] = a[0];
for (i = 1; i < n; ++i) {
partial_sums[i] = partial_sums[i – 1] + a[i];
}
d[0][0] = 1;

for (i = 0; i < n; ++i) {
equals[i][i] = 1;
}

for (i = 2; i <= n; ++i) {
for (j = 0; j <= n – i; ++j) {
equals[j][j + i – 1] = (equals[j][j + i – 2] && (a[j + i – 1] == a[j]));
}
}

// dynamic programming
for (i = 1; i <= n; ++i) {
int border = k;
if (i < k) {
border = i;
}

for (j = 1; j <= border; ++j) {
// int border2 = i – j + 1;
for (r = 1; r <= i; ++r) {
int sub_sum = partial_sums[i – 1] – partial_sums[i – r] + a[i – r];
unsigned char can_be_used = ((r == 1) || !equals[i – r][i – 1]);
unsigned char check = (can_be_used && (sub_sum == b[j – 1]));
if (d[i – r][j – 1] && check) {
d[i][j] = 1;
ans[i][j] = r;
break;
}
}
}
}

if (!d[n][k]) {
printf(“NO\n”);
} else {
printf(“YES\n”);
int curn = n;
int curk = k;

while (curn > 0) {
// print result
int maxval = -1;
int maxindx = curn;

for (i = curn – ans[curn][curk] + 1; i <= curn; ++i) {
if (a[i – 1] > maxval) {
maxval = a[i – 1];
maxindx = i;
}
}

int left_cnt = maxindx – curn + ans[curn][curk] – 1;
int right_cnt = curn – maxindx;

dif[0] = 0; dif[1] = -1;
order[0] = right_cnt; order[1] = left_cnt;
symbol[0] = ‘R’; symbol[1] = ‘L’;

if (left_cnt == 0) {
while (maxindx < curn && a[maxindx] == maxval) {
maxindx++;
left_cnt++;
right_cnt–;
}

dif[0] = 0; dif[1] = -1;
order[0] = right_cnt; order[1] = left_cnt;
symbol[0] = ‘R’; symbol[1] = ‘L’;

} else if (right_cnt == 0 || a[maxindx] == a[maxindx – 1]) {
dif[0] = -1; dif[1] = 0;
order[0] = left_cnt; order[1] = right_cnt;
symbol[0] = ‘L’; symbol[1] = ‘R’;
}

for (j = 0; j < 2; ++j) {
for (i = 0; i < order[j]; ++i) {
printf(“%d %c\n”, maxindx, symbol[j]);
maxindx += dif[j];
}
}

curn -= ans[curn][curk];
curk -= 1;

}
}

return 0;
}

Hi guys , i just tried the Epidemic in Monstropolis problem , hope you might like it .

#include
#include

#define MAXN 500
int a[MAXN];
int b[MAXN];
int partial_sums[MAXN];
unsigned char d[MAXN + 1][MAXN + 1];
unsigned char equals[MAXN + 1][MAXN + 1];
int ans[MAXN + 1][MAXN + 1];
int n, k;
int i, j, r, t;

int dif[2];
int order[2];
char symbol[2];

int main(int argc, char *argv[]) {

#ifndef ONLINE_JUDGE
freopen(“input.txt”, “r”, stdin);
//freopen(“output.txt”, “w”, stdout);
#endif
// read and init data
scanf(“%d”, &n);
for (i = 0; i < n; ++i) {
scanf(“%d”, &a[i]);
}

scanf(“%d”, &k);
for (i = 0; i < k; ++i) {
scanf(“%d”, &b[i]);
}

partial_sums[0] = a[0];
for (i = 1; i < n; ++i) {
partial_sums[i] = partial_sums[i – 1] + a[i];
}
d[0][0] = 1;

for (i = 0; i < n; ++i) {
equals[i][i] = 1;
}

for (i = 2; i <= n; ++i) {
for (j = 0; j <= n – i; ++j) {
equals[j][j + i – 1] = (equals[j][j + i – 2] && (a[j + i – 1] == a[j]));
}
}

// dynamic programming
for (i = 1; i <= n; ++i) {
int border = k;
if (i < k) {
border = i;
}

for (j = 1; j <= border; ++j) {
// int border2 = i – j + 1;
for (r = 1; r <= i; ++r) {
int sub_sum = partial_sums[i – 1] – partial_sums[i – r] + a[i – r];
unsigned char can_be_used = ((r == 1) || !equals[i – r][i – 1]);
unsigned char check = (can_be_used && (sub_sum == b[j – 1]));
if (d[i – r][j – 1] && check) {
d[i][j] = 1;
ans[i][j] = r;
break;
}
}
}
}

if (!d[n][k]) {
printf(“NO\n”);
} else {
printf(“YES\n”);
int curn = n;
int curk = k;

while (curn > 0) {
// print result
int maxval = -1;
int maxindx = curn;

for (i = curn – ans[curn][curk] + 1; i <= curn; ++i) {
if (a[i – 1] > maxval) {
maxval = a[i – 1];
maxindx = i;
}
}

int left_cnt = maxindx – curn + ans[curn][curk] – 1;
int right_cnt = curn – maxindx;

dif[0] = 0; dif[1] = -1;
order[0] = right_cnt; order[1] = left_cnt;
symbol[0] = ‘R’; symbol[1] = ‘L’;

if (left_cnt == 0) {
while (maxindx < curn && a[maxindx] == maxval) {
maxindx++;
left_cnt++;
right_cnt–;
}

dif[0] = 0; dif[1] = -1;
order[0] = right_cnt; order[1] = left_cnt;
symbol[0] = ‘R’; symbol[1] = ‘L’;

} else if (right_cnt == 0 || a[maxindx] == a[maxindx – 1]) {
dif[0] = -1; dif[1] = 0;
order[0] = left_cnt; order[1] = right_cnt;
symbol[0] = ‘L’; symbol[1] = ‘R’;
}

for (j = 0; j < 2; ++j) {
for (i = 0; i < order[j]; ++i) {
printf(“%d %c\n”, maxindx, symbol[j]);
maxindx += dif[j];
}
}

curn -= ans[curn][curk];
curk -= 1;

}
}

return 0;
}

More from author

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Related posts

Advertismentspot_img

Latest posts

I Tried Viral Kitchen Gadgets For 30 Days Here Is the Honest Truth

📢 As an Amazon Associate, I earn from qualifying purchases.After putting the Viral Kitchen Gadgets through a proper 30-day real-world test, I can tell...

Indian Army Organises Inter-Government Degree College Skit Competition in Kupwara

In a vibrant showcase of youthful talent, creativity, and social awareness, the Indian Army successfully organized an Inter-Government Degree College Skit Competition at the...

Best Work-From-Home & Productivity Tech Gifts (2026)

The Best Work-From-Home Tech Gifts for 2026 The home office has become a permanent fixture of modern professional life. Whether your recipient has been working...

Want to stay up to date with the latest news?

We would love to hear from you! Please fill in your details and we will stay in touch. It's that simple!