#include <iostream>
#include <vector>
#include <algorithm>
long long calculateBestTowerOnTheFly() {
long long n, penalty;
std::cin >> n >> penalty;
long long bestTower = 0;
long long bestTowerNValue = 0;
long long smallerTower = 0;
long long bestSmallerNValue = 0;
std::vector<long long> patterns(500001, 0);
std::vector<long long> heights(500001, 0);
for (int i = 0; i < n; i++) {
long long value, pattern;
std::cin >> value >> pattern;
if (heights[pattern] == value) {
continue;
}
long long candidate = patterns[pattern] + value;
long long secondCandidate = bestTower + value - penalty;
if (bestTowerNValue == value) {
secondCandidate = smallerTower + value - penalty;
}
if(std::max(candidate, secondCandidate) > bestTower) {
if(value > bestTowerNValue) {
smallerTower = bestTower;
bestSmallerNValue = bestTowerNValue;
}
bestTowerNValue = value;
bestTower = std::max(bestTower, std::max(candidate, secondCandidate));
}
if (value > heights[pattern]) {
patterns[pattern] = std::max(candidate, secondCandidate);
}
heights[pattern] = value;
}
return bestTower;
}
int main() {
long long result = calculateBestTowerOnTheFly();
std::cout << result << std::endl;
return 0;
}
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 | #include <iostream> #include <vector> #include <algorithm> long long calculateBestTowerOnTheFly() { long long n, penalty; std::cin >> n >> penalty; long long bestTower = 0; long long bestTowerNValue = 0; long long smallerTower = 0; long long bestSmallerNValue = 0; std::vector<long long> patterns(500001, 0); std::vector<long long> heights(500001, 0); for (int i = 0; i < n; i++) { long long value, pattern; std::cin >> value >> pattern; if (heights[pattern] == value) { continue; } long long candidate = patterns[pattern] + value; long long secondCandidate = bestTower + value - penalty; if (bestTowerNValue == value) { secondCandidate = smallerTower + value - penalty; } if(std::max(candidate, secondCandidate) > bestTower) { if(value > bestTowerNValue) { smallerTower = bestTower; bestSmallerNValue = bestTowerNValue; } bestTowerNValue = value; bestTower = std::max(bestTower, std::max(candidate, secondCandidate)); } if (value > heights[pattern]) { patterns[pattern] = std::max(candidate, secondCandidate); } heights[pattern] = value; } return bestTower; } int main() { long long result = calculateBestTowerOnTheFly(); std::cout << result << std::endl; return 0; } |
English