제출 #1227069

#제출 시각아이디문제언어결과실행 시간메모리
1227069cpdreamerBoat (APIO16_boat)C++20
100 / 100
957 ms16180 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using namespace std;
const long long INF = 1e17;
typedef long long ll;
const ll MOD = 1e9+7;
#define F first
#define pb push_back
#define S second
#define P pair
#define V vector
#define all(v) v.begin(), v.end()
typedef tree<int,null_type,less<int>,rb_tree_tag, tree_order_statistics_node_update> indexed_multiset;
void file() {
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
}
ll add(ll a,ll b) {
    return ((a%MOD)+(b%MOD))%MOD;
}
ll mul(ll a,ll b) {
    return ((a%MOD)*(b%MOD))%MOD;
}
ll md(ll a) {
    return ((a%MOD)+MOD)%MOD;
}
ll dif(ll a,ll b) {
    return md(md(a)-md(b));
}
long long binpow(long long a, long long b, long long m) {
    a %= m;
    long long res = 1;
    while (b > 0) {
        if (b & 1)
            res = res * a % m;
        a = a * a % m;
        b >>= 1;
    }
    return res;
}
ll mod_inv(ll a) {
    return binpow(a,MOD-2,MOD)%MOD;
}
ll inv[2000];
ll v[2000][2000];
ll dp[2000][2000];
ll f(int n,ll A[],ll B[]) {
    for (ll i=1;i<=n;i++) {
        inv[i]=mod_inv(i);
    }
    V<ll>vp;
    V<ll>l,r;
    for (int i=0;i<n;i++) {
        vp.pb(A[i]);
        vp.pb(B[i]);
    }
    sort(all(vp));
    auto it=unique(all(vp));
    vp.resize(distance(vp.begin(),it));
    for (int i=0;i<(int)vp.size()-1;i++) {
        l.pb(vp[i]),r.pb(vp[i]);
        if (vp[i]+1<=vp[i+1]-1) {
            l.pb(vp[i]+1),r.pb(vp[i+1]-1);
        }
    }
    l.pb(vp[(int)vp.size()-1]);
    r.pb(vp[(int)vp.size()-1]);
    int m=(int)l.size();
    for (int i=0;i<n;i++) {
        for (int j=0;j<m;j++) {
            if (A[i]<=l[j] && r[j]<=B[i]) {
                v[i][j]=1;
            }
            else
                v[i][j]=0;
        }
    }
    ll x[n+100];
    for (ll j=0;j<m;j++) {
        ll L=r[j]-l[j]+1;
        x[0]=L;
        for (ll i=1;i<=n;i++) {
            x[i]=x[i-1];
            x[i]=mul(x[i],i+L);
            x[i]=mul(x[i],inv[i+1]);
        }
        if (v[0][j]==1) {
            dp[0][j]=(r[j]-l[j]+1)%MOD;
        }
        else {
            dp[0][j]=0;
        }
        if (j>0) {
            dp[0][j]=add(dp[0][j],dp[0][j-1]);
        }
        for (int  i=1;i<n;i++) {
            int c=0;
            dp[i][j]=0;
            if (v[i][j]==1) {
                for (int g=i-1;g>=0;g--) {
                    if (j>0) {
                        dp[i][j]=add(dp[i][j],mul(dp[g][j-1],x[c]));
                    }
                    if (v[g][j]==1) {
                        c++;
                    }
                }
                dp[i][j]=add(dp[i][j],x[c]);
            }
            if (j>0) {
                dp[i][j]=add(dp[i][j],dp[i][j-1]);
            }
        }
    }
    ll ans=0;
    for (int i=0;i<n;i++) {
        ans=add(ans,dp[i][m-1]);
    }
    return ans;
}
ll g(int n,ll A[],ll B[]) {
    V<ll>dp1[n];
    for (ll i=0;i<B[0]-A[0]+1;i++) {
        dp1[0].pb(i+1);
    }
    for (ll i=1;i<n;i++) {
        for (ll j=0;j<B[i]-A[i]+1;j++) {
            ll x=1;
            for (ll g=i-1;g>=0;g--) {
                if (j+A[i]<=A[g]) {
                    continue;
                }
                x=add(x,dp1[g][min(B[g]-A[g],j+A[i]-1-A[g])]);
            }
            dp1[i].pb(x);
        }
        for (ll j=1;j<B[i]-A[i]+1;j++) {
            dp1[i][j]=add(dp1[i][j],dp1[i][j-1]);
        }
    }
    ll ans=0;
    for (ll i=0;i<n;i++) {
        ans=add(ans,dp1[i][B[i]-A[i]]);
    }
    return ans;
}
void solve() {
    int n;
    cin>>n;
    ll A[n],B[n];
    for (int i=0;i<n;i++) {
        cin>>A[i]>>B[i];
    }
    cout<<f(n,A,B)<<endl;
}

void generate() {
    for (int t=0;t<100;t++) {
        int n=(rand()%(int)10)+500;
        if (n>4 )continue;
        ll A[n],B[n];
        for (int i=0;i<n;i++) {
            A[i]=rand()%(ll)1e9;
            B[i]=A[i]+rand()%(ll)1e9;
        }
        if (f(n,A,B)!=g(n,A,B)) {
            cout<<n<<endl;
            for (int i=0;i<n;i++) {
                cout<<A[i]<<" "<<B[i]<<endl;
            }
            cout<<"Output: "<<f(n,A,B)<<endl;
            cout<<"Correct: "<<g(n,A,B)<<endl;
            break;
        }
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
  //  file();
   solve();
   // generate();
}

컴파일 시 표준 에러 (stderr) 메시지

boat.cpp: In function 'void file()':
boat.cpp:16:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |     freopen("input.txt","r",stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
boat.cpp:17:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   17 |     freopen("output.txt","w",stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...