Codeforces Round #408 (Div. 2), problem: (E) Exam Cheating Solution in C/C++

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <assert.h>

#define clr(ar) memset(ar, 0, sizeof(ar))
#define read() freopen(“lol.txt”, “r”, stdin)

short dp[2][1052][1052];
int n, p, k, A[10010], B[10010], C[10010];

int solve(int lim){
int i, j, p, x, u, v, a, b, res;

clr(dp);
for (p = 1; p <= lim; p++){
u = p & 1, v = u ^ 1;
for (i = n + 1; i >= 1; i–){
a = ((i + k) > n) ? n + 1 : i + k;
for (j = n + 1; j >= i && i != (n + 1); j–){
dp[u][i][j] = dp[u][i + 1][j];
x = A[i + k – 1] – A[i – 1] + dp[v][a][j] – C[j – 1] + C[i – 1];
if (x > dp[u][i][j]) dp[u][i][j] = x;
}

if (j != (n + 1)){
j = i;
a = ((j + k) > n) ? n + 1 : j + k;
res = dp[u][i][j + 1];
x = B[j + k – 1] – B[j – 1] + dp[v][i][a] – C[i – 1] + C[j – 1];
if (x > res) res = x;
if (res > dp[u][i][j]) dp[u][i][j] = res;
}

for (j = i – 1; j >= 1; j–){
a = ((j + k) > n) ? n + 1 : j + k;
dp[u][i][j] = dp[u][i][j + 1];
x = B[j + k – 1] – B[j – 1] + dp[v][i][a] – C[i – 1] + C[j – 1];
if (x > dp[u][i][j]) dp[u][i][j] = x;
}
}
}
return dp[lim & 1][1][1];
}

int main(){
int i, j, l, x;

while (scanf(“%d %d %d”, &n, &p, &k) != EOF){
clr(A), clr(B), clr(C);

scanf(“%d”, &l);
while (l–){
scanf(“%d”, &x);
A[x] = 1;
}
scanf(“%d”, &l);
while (l–){
scanf(“%d”, &x);
B[x] = 1;
}
for (i = 1; i < 10010; i++) C[i] = A[i] & B[i];
for (i = 1; i < 10010; i++) A[i] += A[i – 1], B[i] += B[i – 1], C[i] += C[i – 1];

printf(“%d\n”, solve(p));
}
return 0;
}

Leave a Reply

Your email address will not be published. Required fields are marked *