Submission #96009

#TimeUsernameProblemLanguageResultExecution timeMemory
96009oolimryBoat (APIO16_boat)C++14
9 / 100
33 ms8312 KiB
#include <bits/stdc++.h>

using namespace std;
typedef pair<long long, long long> ii;
long long mod = 1000000007;
//long long dp[505][2005];
int main()
{
    //freopen("i.txt","r",stdin);
    ios_base::sync_with_stdio(false);
    int n;
    cin >> n;
    long long a[n];
    long long b[n];
    set<long long> s;
    for(int i = 0;i < n;i++){
        cin >> a[i] >> b[i];
        s.insert(a[i]);
        s.insert(b[i]);
    }
    //cout << s.size() << endl;
    vector<long long> k;
    for(set<long long>::iterator it = s.begin();it != s.end();it++){
        k.push_back(*it);
    }
    //cout << k.size() << endl;
    vector<ii> ranges;
    for(int i = 0;i < k.size();i++){
        ranges.push_back(ii(k[i],k[i]));
        if(i != 0){
            if(k[i] != k[i-1]+1){
                ranges.push_back(ii(k[i-1]+1,k[i]-1));
            }
        }
    }
    sort(ranges.begin(),ranges.end());
    int m = ranges.size();
    //cout << m << "\n";
    long long diff[m];
    for(int i = 0;i < m;i++){
        diff[i] = ranges[i].second - ranges[i].first + 1;
        //cout << ranges[i].first << " " << ranges[i].second << "\n";
    }



    static long long dp[505][2005];

    for(int i = 0;i < n;i++){
        for(int j = 0;j < m;j++){
            dp[i][j] = 0ll;
        }
    }

    for(int j = 0;j < m;j++){
        if(a[0] <= ranges[j].first && b[0] >= ranges[j].second){
            dp[0][j] = diff[j];
        }
    }
    for(int i = 1;i < n;i++){
        ///take nothing for this school
        for(int j = 0;j < m;j++){
            dp[i][j] += dp[i-1][j];
            dp[i][j] %= mod;
        }
        long long acc = 0ll;
        for(int j = 0;j < m;j++){
            if(j != 0) acc += dp[i-1][j-1];
            acc %= mod;
            if(a[i] <= ranges[j].first && b[i] >= ranges[j].second){
                long long x = acc;
                x += 1;
                x *= diff[j];
                acc %= mod;
                dp[i][j] += x;
                dp[i][j] %= mod;
            }
        }
    }
/*
    for(int j = 0;j < m;j++){
        cout << ranges[j].first << " " << ranges[j].second << ": ";
        for(int i = 0;i < n;i++){
            cout << dp[i][j] << " ";
        }
        cout << "\n";
    }
    */
    long long ans = 0ll;
    for(int j = 0;j < m;j++){
        ans  += dp[n-1][j];
        ans %= mod;
    }
    cout << ans;

    return 0;
}

Compilation message (stderr)

boat.cpp: In function 'int main()':
boat.cpp:28:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0;i < k.size();i++){
                   ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...