Mam problem z takim zadaniem: https://szkopul.edu.pl/problemset/problem/diIixmpgLnmLnihDYGeaDwYQ/site/?key=statement
Samo zadanie wydało mi się łatwe. Sortuje elementy od najmniejszych wymaganych publikacji i idę od góry zachłanem z setem, żeby naliczyć koszt[v] = min koszt biorąc A[v] elementów. I potem dla każdego zapytania się bin searchuję po kosztach. Napisałem kod i dostaję całą masę WA, i nie wiem, gdzie jest błąd:
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
struct Element
{
ll ile_cytowan;
ll cena;
bool operator < (const Element &element) const
{
return ile_cytowan < element.ile_cytowan;
}
};
ll n = 0, q = 0;
ll suma = 0;
vector<Element> elementy;
vector<ll> koszty;
multiset<ll> S;
inline void napelniaj()
{
koszty.assign(n,1e18+20);
for (int i = n-1; i >= 0; --i)
{
suma += elementy[i].cena;
S.insert(elementy[i].cena);
while(S.size() > elementy[i].ile_cytowan)
{
ll val = *S.rbegin();
suma -= val;
S.erase(S.lower_bound(val));
}
if (S.size() == elementy[i].ile_cytowan)
koszty[i] = suma;
}
}
inline ll zapytanie()
{
ll wartosc;
cin >> wartosc;
int poczatek = -1, koniec = n, srodek = 0;
while(koniec - poczatek > 1)
{
srodek = (poczatek + koniec) / 2;
if (wartosc >= koszty[srodek])
poczatek = srodek;
else
koniec = srodek;
}
if (poczatek == -1)
return 0;
else
return elementy[poczatek].ile_cytowan;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> q;
elementy.assign(n,{});
for (int i = 0; i < n; ++i)
cin >> elementy[i].ile_cytowan >> elementy[i].cena;
sort(elementy.begin(), elementy.end());
napelniaj();
while(q--)
cout << zapytanie() << '\n';
return 0;
}
Program zazwyczaj daje lekko za małe odpowiedzi.
edit: usunąłem jednego if-a w operatorze bo i tak nic nie dawał.
Z góry dziękuję za pomoc i poświęcony czas!