Submission #1293448

#TimeUsernameProblemLanguageResultExecution timeMemory
1293448SSKMFFancy Fence (CEOI20_fancyfence)C++20
100 / 100
17 ms2384 KiB
#include <bits/stdc++.h>
using namespace std;

const int mod(1000000007);
pair <int , int64_t> sir[100001];
int stiva[100001];

int main ()
{
    ios :: sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    int lungime;
    cin >> lungime;
    
    for (int indice = 1 ; indice <= lungime ; indice++)
        { cin >> sir[indice].first; }
    for (int indice = 1 ; indice <= lungime ; indice++)
        { cin >> sir[indice].second; sir[indice].second += sir[indice - 1].second; }

    int modalitati = 0;
    for (int indice = 1 ; indice <= lungime ; indice++)
    {
        while (stiva[0] && sir[stiva[stiva[0]]].first >= sir[indice].first)
        {
            const int cantitate = (sir[indice - 1].second - (stiva[0] == 1 ? 0 : sir[stiva[stiva[0] - 1]].second)) % mod;
            const int stanga = (sir[stiva[stiva[0]] - 1].second - (stiva[0] == 1 ? 0 : sir[stiva[stiva[0] - 1]].second)) % mod;
            const int dreapta = (sir[indice - 1].second - sir[stiva[stiva[0]]].second) % mod;

            (modalitati += 250000002LL * sir[stiva[stiva[0]]].first % mod * (sir[stiva[stiva[0]]].first + 1) % mod * (((1LL * cantitate * (cantitate + 1) % mod - 1LL * stanga * (stanga + 1) % mod - 1LL * dreapta * (dreapta + 1) % mod) % mod + mod) % mod) % mod) %= mod;
            stiva[0]--;
        }

        stiva[++stiva[0]] = indice;
    }
    
    for ( ; stiva[0] ; stiva[0]--)
    {
        const int cantitate = (sir[lungime].second - (stiva[0] == 1 ? 0 : sir[stiva[stiva[0] - 1]].second)) % mod;
        const int stanga = (sir[stiva[stiva[0]] - 1].second - (stiva[0] == 1 ? 0 : sir[stiva[stiva[0] - 1]].second)) % mod;
        const int dreapta = (sir[lungime].second - sir[stiva[stiva[0]]].second) % mod;

        (modalitati += 250000002LL * sir[stiva[stiva[0]]].first % mod * (sir[stiva[stiva[0]]].first + 1) % mod * (((1LL * cantitate * (cantitate + 1) % mod - 1LL * stanga * (stanga + 1) % mod - 1LL * dreapta * (dreapta + 1) % mod) % mod + mod) % mod) % mod) %= mod;
    }

    cout << modalitati;
    return 0;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...