제출 #1171096

#제출 시각아이디문제언어결과실행 시간메모리
1171096userro1234324Two Dishes (JOI19_dishes)C++20
10 / 100
101 ms31816 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();
}

컴파일 시 표준 에러 (stderr) 메시지

dishes.cpp: In function 'void wczytaj()':
dishes.cpp:16:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |     scanf("%d %d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~~
dishes.cpp:19:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   19 |         scanf("%d %lld %d", &pom, &czasy_maksymalne1[i], &punkty1[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dishes.cpp:24:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   24 |         scanf("%d %lld %d", &pom, &czasy_maksymalne2[i], &punkty2[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...