제출 #1362940

#제출 시각아이디문제언어결과실행 시간메모리
1362940AndreyAsteroid Mining (CCO25_day1problem1)C++17
25 / 25
121 ms26136 KiB
#include<bits/stdc++.h>
using namespace std;

vector<long long> idk[50];
vector<long long> dp[50];

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    long long n,m,a,b;
    cin >> n >> m;
    vector<pair<long long,long long>> haha(0);
    for(long long i = 0; i < n; i++) {
        cin >> a >> b;
        haha.push_back({b,a});
    }
    sort(haha.begin(),haha.end());
    long long y = 0;
    vector<long long> br(n+100,-1);
    for(long long i = 0; i < haha.size(); i++) {
        if(i > 0 && haha[i].first != haha[i-1].first) {
            y++;
        }
        idk[y].push_back(haha[i].second);
        br[y] = haha[i].first;
    }
    for(long long i = 0; i < 50; i++) {
        sort(idk[i].begin(),idk[i].end());
        reverse(idk[i].begin(),idk[i].end());
    }
    dp[0].push_back(0);
    long long p = -1;
    for(long long i = 0; i < 50; i++) {
        if(br[i+1] == -1) {
            p = i;
            break;
        }
        long long c = (m%br[i+1])/br[i];
        long long d = br[i+1]/br[i];
        long long a = 0,b = 0,sb = dp[i][0];
        while(a+b < c && (a+1 < dp[i].size() || b < idk[i].size())) {
            if(a+1 < dp[i].size() && (b == idk[i].size() || (dp[i][a+1]-dp[i][a] > idk[i][b]))) {
                sb+=dp[i][a+1]-dp[i][a];
                a++;
            }
            else {
                sb+=idk[i][b];
                b++;
            }
        }
        dp[i+1].push_back(sb);
        while((a+1 < dp[i].size() || b < idk[i].size())) {
            if(a+1 < dp[i].size() && (b == idk[i].size() || (dp[i][a+1]-dp[i][a] > idk[i][b]))) {
                sb+=dp[i][a+1]-dp[i][a];
                a++;
            }
            else {
                sb+=idk[i][b];
                b++;
            }
            if((a+b-c)%d == 0) {
                dp[i+1].push_back(sb);
            }
        }
        dp[i+1].push_back(sb);
    }
    long long ans = dp[p][0];
    vector<long long> yo(0);
    for(long long i = 1; i < dp[p].size(); i++) {
        yo.push_back(dp[p][i]-dp[p][i-1]);
    }
    for(long long v: idk[p]) {
        yo.push_back(v);
    }
    sort(yo.begin(),yo.end());
    reverse(yo.begin(),yo.end());
    long long x = min((long long)yo.size(),m/br[p]);
    for(long long i = 0; i < x; i++) {
        ans+=yo[i];
    }
    cout << ans;
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…