Submission #1141873

#TimeUsernameProblemLanguageResultExecution timeMemory
1141873RafiullahFlooding Wall (BOI24_wall)C++20
44 / 100
403 ms315972 KiB
#include<bits/stdc++.h>
// #include <ext/pb_ds/tree_policy.hpp>
// #include <ext/pb_ds/assoc_container.hpp>
 
using namespace std;
#define int long long
const int N = 10005;
const int mod = 1e9 + 7;
const int mod1 = 998244353;
const int LG = 20;
// #define s(i) (*s.find_by_order(i)) // Warning : Read this line.
set<pair<int,int>> S;
int power(int b,int e){
    if(e<=0)return 1;
    int o = power(b,e>>1);
    o *= o, o %= mod1;
    if(e % 2)o *= b, o %= mod1;
    return o;
}
int a[N], b[N];
void solve(){
    int n;cin >> n ;int m = 0;
    for(int i = 1 ; i <= n ; i ++)
        cin >> a[i], m = max(m,a[i]);
    for(int i = 1 ; i <= n ; i ++)
        cin >> b[i], m = max(m,b[i]);
    for(int i = 1 ; i <= n ;i  ++)
        if(a[i] > b[i])swap(a[i],b[i]);
    if(n <= 20){int ans = 0;
        for(int i = 0 ; i < (1LL << n) ; i ++){
            vector<int> t(n + 2);
            for(int j = 0 ; j < n ; j ++)
                if(i & (1LL << j))t[j + 1] = b[j+1];
                else t[j + 1] = a[j+1];
            vector<int> suf(n + 2);
            suf[n]=t[n];
            for(int j = n - 1 ; j >= 1;  j--)
                suf[j]=max(suf[j+1],t[j]);
            int p = t[1];int o = 0;
            for(int j = 2 ; j < n ; j ++){
                o += max(0ll,min(p,suf[j+1]) - t[j]) ,o%=mod;
                p=max(p,t[j]);
            }
            ans += o, ans %= mod;
        }
        cout << ans << '\n';return;
    }
    vector<vector<int>> f(n + 2,vector<int>(m + 2));
    vector<vector<int>> s(n + 2,vector<int>(m + 2));
    vector<vector<int>> e(n + 2,vector<int>(m + 2));    
    vector<vector<int>> es(n + 2,vector<int>(m + 2));
    // vector<vector<int>> suf(n + 2, vector<int>(m + 2));
    f[1][a[1]] = 1;
    f[1][b[1]] = 1;
    s[1][a[1]] = 1;
    s[1][b[1]] = 1;
    for(int i = 1 ; i <= m ; i ++)s[1][i] += s[1][i-1];
    for(int i = 2 ; i <= n ; i ++){
        for(int j = 1 ; j <= m ; j ++){
            if(a[i] < j)
                f[i][j] += f[i - 1][j];
            else if(a[i] == j)
                f[i][j] += s[i - 1][j];
            f[i][j] %= mod;
            if(b[i] < j)
                f[i][j] += f[i - 1][j];
            else if(b[i] == j)
                f[i][j] += s[i - 1][j];
            f[i][j] %= mod;
            s[i][j] += s[i][j-1] + f[i][j], s[i][j] %= mod;
        }
    }
    e[n][a[n]] = 1;
    e[n][b[n]] = 1;
    // suf[n][a[n]] = suf[n][b[n]] = 1;
    es[n][a[n]] = es[n][b[n]] = 1;
    for(int i = 1 ; i <= m ; i ++)
        es[n][i] += es[n][i - 1];
    // for(int i = m ; i >= 1 ; i --)
    //     suf[n][i] += suf[n][i+1];
    for(int i = n - 1 ; i >= 1 ; i --){
        for(int j = 1 ; j <= m ; j ++){
            if(a[i] < j)
                e[i][j] += e[i + 1][j];
            else if(a[i] == j)
                e[i][j] += es[i + 1][j];
            e[i][j] %= mod;
            if(b[i] < j)
                e[i][j] += e[i + 1][j];
            else if(b[i] == j)
                e[i][j] += es[i + 1][j];
            e[i][j] %= mod;
            es[i][j] += (es[i][j - 1] + e[i][j])%mod, es[i][j] %= mod;
        }
        // for(int j = m ; j >= 1 ; j --)
        //     suf[i][j] += suf[i][j+1] + e[i][j],suf[i][j] %= mod; 
    }
    int ans = 0;
    for(int i = 2 ; i < n ; i ++){
        for(int t = 1 ; t <= m ; t ++){
            int ho = m - t + 1;
            int left = ((f[i-1][t]*(es[i+1][m]-es[i+1][t]))%mod) * max(0ll,t - a[i]) %mod;left%=mod;
            int right=((f[i-1][t]*(es[i+1][m]-es[i+1][t]))%mod)*max(0ll,t-b[i])%mod;right %=mod;
            ans += (left + right)%mod, ans %= mod;
        }
        for(int t = 1 ; t <= m ; t ++){
            int left = (((s[i-1][m]-s[i-1][t-1])*e[i+1][t])%mod) * max(0ll,t-a[i]) ; left %= mod;
            int right = (((s[i-1][m]-s[i-1][t-1])*e[i+1][t])%mod) * max(0ll, t-b[i]);right%= mod;
            ans += (left + right)%mod, ans %= mod;
        }
    }
    cout << ans << '\n';
}
signed main(){
    ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
    int t = 1;
    // cin >> t;
    while(t --){
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...