Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //< in.txt > out.txt
- #include <algorithm>
- #include <bitset>
- #include <cmath>
- #include <cstdio>
- #include <cstring>
- #include <deque>
- #include <iomanip>
- #include <iostream>
- #include <queue>
- #include <map>
- #include <numeric>
- #include <set>
- #include <sstream>
- #include <stack>
- #include <utility>
- #include <vector>
- #include <fstream>
- #define INF 1000000000
- #define FOR(i, a, b) for(int i=int(a); i<int(b); i++)
- #define FORC(cont, it) for(typeof((cont).begin()) it = (cont).begin(); it != (cont).end(); it++)
- #define pb push_back
- using namespace std;
- typedef long long ll;
- typedef pair<int, int> ii;
- typedef vector<int> vi;
- typedef vector<ii> vii;
- typedef vector<vi> vvi;
- #define maxN 100000
- struct Data {
- ll cost;
- bool operator <(const Data &r) const {
- return cost > r.cost;
- }
- };
- ll A[maxN], B[maxN];
- int main() {
- ifstream in("landscape.in");
- ofstream out("landscape.out");
- ll N, X, Y, Z;
- while (in >> N >> X >> Y >> Z) {
- FOR(i, 0, N) in >> A[i] >> B[i];
- ll acum = 0, ans = 0;
- priority_queue<Data> q1, q2;
- FOR(i, 0, N) {
- while (A[i] > B[i]) {
- ll toPay = Y;
- if (!q1.empty()&&q1.top().cost+i*Z<Y) {
- toPay = q1.top().cost + i*Z;
- q1.pop();
- }
- ans += toPay;
- q2.push(Data{ -i*Z - toPay });
- A[i]--;
- }
- while(A[i]<B[i]) {
- ll toPay = X;
- if (!q2.empty() && q2.top().cost+i*Z<X) {
- toPay = q2.top().cost + i*Z;
- q2.pop();
- }
- ans += toPay;
- q1.push(Data{ -i*Z - toPay });
- A[i]++;
- }
- }
- out << ans << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment