# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1171096 | userro1234324 | Two Dishes (JOI19_dishes) | C++20 | 101 ms | 31816 KiB |
#include <bits/stdc++.h>
using namespace std;
int n, m;
const int maxn = 1000001;
long long czasy_skonczenia1[maxn];
long long czasy_skonczenia2[maxn];
long long czasy_maksymalne1[maxn];
long long czasy_maksymalne2[maxn];
int punkty1[maxn];
int punkty2[maxn];
//long long punkty_pref1[maxn];
long long punkty_pref2[maxn];
int ile_mozna_skonczyc_innych1[maxn];
int ile_mozna_skonczyc_innych2[maxn];
void wczytaj() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
int pom;
scanf("%d %lld %d", &pom, &czasy_maksymalne1[i], &punkty1[i]);
czasy_skonczenia1[i] = pom + czasy_skonczenia1[i - 1];
}
for (int i = 1; i <= m; i++) {
int pom;
scanf("%d %lld %d", &pom, &czasy_maksymalne2[i], &punkty2[i]);
czasy_skonczenia2[i] = pom + czasy_skonczenia2[i - 1];
punkty_pref2[i] = punkty_pref2[i - 1] + punkty2[i];
}
}
void znajdz_ile_mozna_skonczyc_innych1(int i) {
if (czasy_skonczenia1[i] > czasy_maksymalne1[i]) {
ile_mozna_skonczyc_innych1[i] = -1;
return;
}
int pocz = 0, kon = m;
while (pocz < kon) {
int srodek = (pocz + kon + 1) / 2;
if (czasy_skonczenia1[i] + czasy_skonczenia2[srodek] <= czasy_maksymalne1[i]) pocz = srodek;
else kon = srodek - 1;
}
ile_mozna_skonczyc_innych1[i] = pocz;
return;
}
void znajdz_ile_mozna_skonczyc_innych2(int i) {
if (czasy_skonczenia2[i] > czasy_maksymalne2[i]) {
ile_mozna_skonczyc_innych2[i] = -1;
return;
}
int pocz = 0, kon = n;
while (pocz < kon) {
int srodek = (pocz + kon + 1) / 2;
if (czasy_skonczenia2[i] + czasy_skonczenia1[srodek] <= czasy_maksymalne2[i]) pocz = srodek;
else kon = srodek - 1;
}
ile_mozna_skonczyc_innych2[i] = pocz;
return;
}
void znajdz_ile_mozna_skonczyc_innych() {
for (int i = 1; i <= n; i++) znajdz_ile_mozna_skonczyc_innych1(i);
for (int i = 1; i <= m; i++) znajdz_ile_mozna_skonczyc_innych2(i);
}
long long najlepszy_wynik_punktowy[2001][2001];
void podzadanie3() {
for (int i = 1; i <= n; i++) {
najlepszy_wynik_punktowy[i][0] = najlepszy_wynik_punktowy[i - 1][0];
if (ile_mozna_skonczyc_innych1[i] >= 0) najlepszy_wynik_punktowy[i][0] += punkty1[i];
}
for (int i = 1; i <= m; i++) {
najlepszy_wynik_punktowy[0][i] = najlepszy_wynik_punktowy[0][i - 1];
if (ile_mozna_skonczyc_innych2[i] >= 0) najlepszy_wynik_punktowy[0][i] += punkty2[i];
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
najlepszy_wynik_punktowy[i][j] = max(najlepszy_wynik_punktowy[i - 1][j] + (j <= ile_mozna_skonczyc_innych1[i]) * punkty1[i],
najlepszy_wynik_punktowy[i][j - 1] + (i <= ile_mozna_skonczyc_innych2[j]) * punkty2[j]);
}
}
printf("%lld", najlepszy_wynik_punktowy[n][m]);
}
long long w = -2000000000000000;
void podzadanie1() {
long long suma_punktow1 = 0;
for (int i = 1; i <= n; i++) suma_punktow1 += punkty1[i];
for (int i = n; i >= 0; i--) {
if (ile_mozna_skonczyc_innych1[i] == -1) {
suma_punktow1 -= punkty1[i];
continue;
}
w = max(w, suma_punktow1 + punkty_pref2[ile_mozna_skonczyc_innych1[i]]);
}
printf("%lld", w);
}
int main() {
wczytaj();
znajdz_ile_mozna_skonczyc_innych();
if (n <= 2000 && m <= 2000) {
podzadanie3();
return 0;
}
podzadanie1();
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |