1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include <vector>
//#include <bits/stdc++.h>
//#include <algorithm>

using namespace std;

struct Klocek
{
	int wysokosc = 0;
	int wzorek = 0;
	short roznica = 0;
};

int main()
{
	int liczbaKlockow = 0;
	int pojedynczaKara = 0;

	cin >> liczbaKlockow >> pojedynczaKara;

	//wczytanie danych klockow 
	std::vector<Klocek> klocki;
	for (int i = 0; i < liczbaKlockow; ++i)
	{
		Klocek klocek;
		cin >> klocek.wysokosc >> klocek.wzorek;

		if (klocki.size() > 0 && klocek.wzorek != klocki.back().wzorek)
		{
			klocki.back().roznica++;
			klocek.roznica++;
		}
		klocki.push_back(klocek);
	}


	klocki = vector<Klocek>(klocki.rbegin(), klocki.rend());


	long long ocena = 0;
	int analizowanyKlocekDoDodania = 1;
	for (int i = 0; i < klocki.size() - 1; ++i)
	{
		if (klocki[i].wzorek == klocki[analizowanyKlocekDoDodania].wzorek)
		{
			ocena += klocki[i].wysokosc;
			analizowanyKlocekDoDodania++;
		}
		else if (klocki[i].wzorek != klocki[analizowanyKlocekDoDodania].wzorek && pojedynczaKara < klocki[analizowanyKlocekDoDodania].wysokosc)
		{
			ocena += klocki[i].wysokosc - pojedynczaKara;
			analizowanyKlocekDoDodania++;
		}
		else
		{
			if (i > 0 && klocki[analizowanyKlocekDoDodania].wzorek != klocki[i - 1].wzorek)
			{
				klocki.erase(klocki.begin() + analizowanyKlocekDoDodania);
				i--;
			}
			else if (i == 0 && klocki.size() > 2 && klocki[analizowanyKlocekDoDodania].wzorek == klocki[analizowanyKlocekDoDodania + 1].wzorek)
			{
				klocki.erase(klocki.begin() + i);
				i--;
			}
			else if (i == 0 && klocki.size() > 2 && klocki[analizowanyKlocekDoDodania].wzorek != klocki[analizowanyKlocekDoDodania + 1].wzorek)
			{
				klocki.erase(klocki.begin() + analizowanyKlocekDoDodania);
				i--;
			}
			else if (i > 0 && klocki[analizowanyKlocekDoDodania].wzorek == klocki[i - 1].wzorek)
			{
				if (klocki[i].wysokosc <= klocki[i - 1].wysokosc + klocki[analizowanyKlocekDoDodania].wysokosc)
				{
					klocki.erase(klocki.begin() + i);
					i--;
				}
			}
		}
	}

	cout << ocena;
}