Problem:
Problem E: Rabbit Plays Games!

うさぎがとあるロールプレイングゲームで遊んでいる. 城に入る直前で, 敵に待ち伏せされていた！

うさぎが操作する主人公1 人と, n 体の敵との戦闘となった. 各キャラクターには4 つの能力値, 体力hi, 攻撃力ai, 防御力di, 敏捷si が定められている. i = 0 は主人公の情報, 1 ≤ i ≤ n は各敵の情報を表す.

戦闘はターン制である. 各ターン, 生き残っているキャラクターが, 敏捷の値が高い順に攻撃を行う. 敵は必ず主人公を攻撃する. 主人公は敵1 体を攻撃するが, どの敵を攻撃するかは毎ターンごとに主人公が選べる.攻撃力a のキャラクターが防御力d のキャラクターに攻撃するとき, max{a − d, 0} のダメージが与えられる. 受けたダメージの合計が体力の値以上になったキャラクターは直ちに戦闘不能になってしまう. 主人公が戦闘不能になったとき, あるいは敵がすべて戦闘不能になったとき, 戦闘は終了する.

Input

1 ≤ n ≤ 40 000

1 ≤ hi, ai, di, si ≤ 1 000 000 000 (整数)

si はすべて異なる.

Output

主人公が必ず戦闘不能になってしまうとき, −1 を出力せよ. そうでないとき, 主人公が受けるダメージの合計の最小値を一行に出力せよ.

Sample Input 1

2
10 3 1 2
2 4 1 3
2 2 1 1

Sample Output 1

4

Sample Input 2

1
1 1 1 1
10000 10000 10000 10000

Sample Output 2

-1

Solution in C++14 (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

int N;
vector<int> H, A, D, S;

typedef struct{
    int turn, ad;
}Enemy;

bool operator < (const Enemy& l, const Enemy& r){
    return l.turn * r.ad > r.turn * l.ad;
}

int solve(){
    ll damage = 0;
    for(int i=1; i<=N; i++){
        if(S[i] > S[0])
            damage += max(0, A[i]-D[0]);
        if(D[i] >= A[0])
            return -1;
    }
    
    vector<Enemy> enemies;
    for(int i=1; i<=N; i++){
        int turn = (H[i]+A[0]-D[i]-1) / (A[0]-D[i]);
        Enemy enemy({turn, max(0, A[i]-D[0])});
        enemies.push_back(enemy);
    }
    sort(enemies.begin(), enemies.end());
    
    ll sd = 0;
    for(int i=0; i<N; i++){
        sd += enemies[i].ad;
        damage += sd * enemies[i].turn;
        damage -= enemies[i].ad;
        if(damage >= H[0])
            return -1;
    }
    return damage;
}

int main(){
    cin >> N;
    
    H.resize(N+1); A.resize(N+1); D.resize(N+1), S.resize(N+1);
    for(int i=0; i<=N; i++)
        cin >> H[i] >> A[i] >> D[i] >> S[i];
    
    cout << solve() << endl;
    
    return 0;
}