제출 #1182980

#제출 시각아이디문제언어결과실행 시간메모리
1182980amine_arouaLong Distance Coach (JOI17_coach)C++20
71 / 100
315 ms327680 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 3e18;
int calc_contrb(int mod , int t , int l , int r)
{
    if(l > r)
        return 0;
    // t | i - mod and i in [l , r]
    // t | i and i in [l - mod , r - mod]
    //    (l - mod)/t <=  k <= (r - mod) / t
    int lt = ceil(((double)(l - mod)) / t);
    int rt = floor(((double)(r - mod)) / t);
    return max(0ll , rt - lt + 1);
}
int fr_non_div(int t , int l , int r)
{
    if(l > r)
        return -1;
    // kt <= r
    int fr = (r / t) * t;
    return max(l , fr + 1);
}
int get_fr(int mod , int t, int l , int r)
{
    // k * t + mod >= l <-> k >= (l - mod)/t
    int k = ceil(((double)(l - mod)) / t);
    if(k * t + mod <= r)
        return k * t + mod;
    return INF;
}
int get_lst(int mod , int t , int l , int r)
{
    // k * t + mod <= r <-> k <= (r - mod) / t
    int k = floor(((double)(r - mod)) / t);
    if(k * t + mod >= l)
        return k * t + mod;
    return -1;
}
signed main()
{
    int x , n , m , w , t;
    cin>>x>>n>>m>>w>>t;
    vector<int> s(n + 2);
    s[n + 1] = x + 1;
    s[0] = -1;
    for(int i = 1 ; i <= n ; i++)
        cin>>s[i];
    n = (int)s.size();
    vector<pair<int ,int>> bros(m + 1);
    vector<int> d(m + 1);
    vector<int> c(m + 1);
    for(int i = 1 ; i <= m ; i++)
    {
        cin>>bros[i].first>>bros[i].second;
        d[i] = bros[i].first;
    }
    sort(s.begin() , s.end());
    sort(bros.begin() + 1, bros.end());
    for(int i = 1 ; i <= m ; i++)
    {
        c[i] = bros[i].second + c[i - 1];
    }
    sort(d.begin() + 1 , d.end());
    vector<vector<int>> cst(m + 1 , vector<int>(m + 1 , -1));
    int ans = 0;
    map<int ,int> occs;
    for(int i = n - 2 ; i >= 0 ; i--)
    {
        int l = s[i] + 1 , r = s[i + 1] - 1;
        int fr = fr_non_div(t ,l , r);
        int mn = s[i + 1];
        int mx = s[i];
        ans+=calc_contrb(0 , t , l , r) * w;
        for(int j = 1 ; j <=  m ;j++)
        {   
            ans+=(calc_contrb(bros[j].first, t ,l , r)) * w;
            if(fr != -1 && fr <= r)
            {
                mn = min(mn , get_fr(d[j] , t , fr,r));
                mx = max(mx , get_lst(bros[j].first , t , fr,r));
            }
        }
        // this range is [mn % t , mx % t]
        if(fr != -1 && fr <= r && mn != s[i + 1] && mx != s[i])
        {
            mn %= t;
            mx %= t;
            // cout<<mn % t<<'\n';
            // cout<<mx % t<<'\n';
            assert(binary_search(d.begin() , d.end() , mn));
            assert(binary_search(d.begin() , d.end() , mx));
            int lo = lower_bound(d.begin() + 1 , d.end() , mn) - d.begin();
            int hi = lower_bound(d.begin() + 1 , d.end() , mx) - d.begin();
            // cout<<l<<" "<<r<<" "<<mn<<" "<<mx<<" "<<lo<<" "<<hi<<'\n';
            int run = 0;
            for(int j = hi ; j >= lo ; j--)
            {
                run+=calc_contrb(d[j] , t , fr , x) - occs[d[j]];
                cst[j][hi] = max(cst[j][hi] , run * w);
            }
        }
        occs[s[i] % t]++;
    }
    // cout<<ans<<'\n';
    vector<int> dp(m + 1);
    for(int i = 1 ; i <= m ;  i++)
    {
        dp[i] = dp[i - 1];
        for(int j = 1 ; j <= i ; j++)
        {
            if(cst[j][i] != -1)
            {
                // cout<<"balalaw\n";
                // if(i == 2)
                // {
                //     cout<<j<<" "<<i<<'\n';
                //     cout<<cst[j][i]<<'\n';
                //     cout<<c[i] - c[j - 1] - cst[j][i]<<'\n';
                // }
                dp[i] = min(dp[i] , dp[j - 1] + c[i] - c[j - 1] - cst[j][i]);
            }       
        }
        // cout<<dp[i]<<'\n';
    }
    cout<<dp[m] + ans<<'\n';
    // map , go in backward to calc contribution
    
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...