5524 2023. 07. 04 23:57:44 Andros Gladiátorok (40 pont) cpp17 Időlimit túllépés 32/40 879ms 18924 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <fstream>
#include <unordered_map>
#define ll long long
using namespace std;
//El kene kezdenem kommentezni a feltolteseimet.
//Rajottem, hogy a map nelkul is valamiert csak 18 pontot kaptam
//Azert, mert egy regi proba miatt az akadalyok tomb veletlen szendb nagysaggal inditottam.
//Szoval ez a teszt a mappal, es a hiba nelkul.


//Magyarazattal
int main()
{
	//ifstream cin;
	//cin.open("be2.txt");
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	//Hiba=>Mindenhol long long
	ll szendb, caedb;
	cin >> szendb >> caedb;
	//Beolvasas, a szenatorok parokba lesznek beolvasva.
	vector<pair<ll, ll>> szenator(szendb);
	for (ll i = 0; i < szendb; i++)
	{
		cin >> szenator[i].first >> szenator[i].second;
	}

	vector<ll> caesar(caedb);
	for (ll i = 0; i < caedb; i++)
	{
		cin >> caesar[i];
	}

	//A szortirozas az elso par szerint szortiroz.
	//Azzal mindenkepp max pontot erunk el, ha a leggyengebbek lesznek elol.
	sort(szenator.begin(), szenator.end());

	vector<ll> hozott_ero(szendb);//az ero, amit az eddig legyozott gladiatorokbol szerzunk.
	ll sum = 0;
	for (ll i = 0; i < szendb; i++)
	{
		hozott_ero[i] = sum;
		sum += szenator[i].second;
	}

	vector<ll> kello_ero(szendb);//Az ero ami az elejetol kell, hogy legyozzuk
	for (ll i = 0; i < szendb; i++)
	{
		kello_ero[i] = szenator[i].first - hozott_ero[i];
	}

	//Otlet: Ha a kello_ero={5, 2, 8}
	//akkor a 2-esen senki se fog elbukni. Mert mar atment az 5-oson.
	vector<pair<ll, ll>> akadalyok;
	ll max = 0;
	for (int i = 0; i < szendb; i++)
	{
		if (kello_ero[i] > max) {//Ha uj legnagyobb "akadaly" van
			max = kello_ero[i];
			akadalyok.push_back({ kello_ero[i], i });//lementem indexxel egyutt
		}
	}

	//A vegen elkapjuk a legerosebbet egy nagyon nagy szammal
	//long long limit     9223372036854775807
	akadalyok.push_back({ 9223372036854775807, szendb });
	//akadalyok.push_back({ 10000000000000000000, szendb });
	//^ez hibat dob, de VS nem jelzi ki hogy nagyobb, mint az ll limit^
	//^              de eggyel tobb 0-val kijelzi                     ^

	unordered_map<ll, ll> megoldas;
	for (ll glad : caesar) {
		if (megoldas.find(glad) != megoldas.end()) {
			//Ha le van mentve, kiirom
			cout << megoldas[glad] << " ";
		}
		else {//Ha nincs lementve
			for (auto elem : akadalyok) {//megkeresem az elso akadalyt, ami megoli
				if (elem.first > glad) {
					megoldas.emplace(glad, elem.second);//Es lementem
					//Majd kiirom
					cout << elem.second << " ";
					break;
				}
			}
		}
	}

}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 32/40
1 Elfogadva 0/0 3ms 1696 KiB
2 Elfogadva 0/0 16ms 4624 KiB
3 Elfogadva 2/2 3ms 2108 KiB
4 Elfogadva 2/2 3ms 2448 KiB
5 Elfogadva 2/2 4ms 2788 KiB
6 Elfogadva 2/2 4ms 2940 KiB
7 Elfogadva 2/2 4ms 2864 KiB
8 Elfogadva 2/2 4ms 2928 KiB
9 Elfogadva 2/2 4ms 3192 KiB
10 Elfogadva 2/2 4ms 3404 KiB
11 Elfogadva 2/2 24ms 5752 KiB
12 Elfogadva 2/2 111ms 17820 KiB
13 Elfogadva 2/2 115ms 18924 KiB
14 Időlimit túllépés 0/2 843ms 11552 KiB
15 Időlimit túllépés 0/2 870ms 13156 KiB
16 Időlimit túllépés 0/2 879ms 11812 KiB
17 Időlimit túllépés 0/2 861ms 12016 KiB
18 Elfogadva 2/2 56ms 12768 KiB
19 Elfogadva 2/2 56ms 12904 KiB
20 Elfogadva 2/2 56ms 12908 KiB
21 Elfogadva 2/2 59ms 12932 KiB
22 Elfogadva 2/2 59ms 13148 KiB