답안 #150344

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
150344 2019-09-01T08:11:17 Z Cafe Maru(#3599, bryan, pps789, kazel) 최적의 팀 구성 (FXCUP4_squad) C++17
0 / 100
6 ms 384 KB
#include "squad.h"
#include<bits/stdc++.h>
using namespace std;
using ll = long long;

struct Line {
    Line(ll a, ll b, ll idx) : a(a), b(b), idx(idx) {}
    long long a, b, idx;
    pair<ll,ll> y(pair<ll,ll> x) const { return {a * x.first + b * x.second, idx}; }
};

struct CHTLinear {
    vector<Line> stk;
    int qpt;
    CHTLinear() : qpt(0) { }
    // when you need maximum :  (previous l).a < (now l).a
    // when you need minimum :  (previous l).a > (now l).a
    void pushLine(const Line& l) {
        while (stk.size() > 1) {
            Line& l0 = stk[stk.size() - 1];
            Line& l1 = stk[stk.size() - 2];
            if ((l0.b - l.b) * (l0.a - l1.a) > (l1.b - l0.b) * (l.a - l0.a)) break;
            stk.pop_back();
        }
        stk.push_back(l);
    }
    // (previous x) <= (current x)
    // it calculates max/min at x
    pair<ll, ll> query(pair<ll,ll> x) {
        while (qpt + 1 < stk.size()) {
            Line& l0 = stk[qpt];
            Line& l1 = stk[qpt + 1];
            if (l1.a - l0.a > 0 && (l0.b - l1.b) * x.second > x.first * (l1.a - l0.a)) break;
            if (l1.a - l0.a < 0 && (l0.b - l1.b) * x.second < x.first * (l1.a - l0.a)) break;
            ++qpt;
        }
        return stk[qpt].y(x);
    }
};

CHTLinear cht;
pair<ll, ll> pr[2];

void Init(std::vector<int> A, std::vector<int> D, std::vector<int> P){
	int N = A.size();
    for(int i=0;i<N;i++) {
        cht.pushLine(Line(P[i], A[i], i));
        if (P[i] > pr[0].first) {
            pr[1] = pr[0];
            pr[0] = {P[i], i};
        } else if (P[i] > pr[1].first) {
            pr[1] = {P[i], i};
        }
    }
}

long long BestSquad(int X, int Y) {
    auto ret = cht.query({Y,X});
    if(ret.second == pr[0].second) {
        return ret.first + X + Y*pr[1].first;
    }
    return ret.first + X + Y*pr[0].first;
}

Compilation message

squad.cpp: In member function 'std::pair<long long int, long long int> CHTLinear::query(std::pair<long long int, long long int>)':
squad.cpp:30:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (qpt + 1 < stk.size()) {
                ~~~~~~~~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -