Submission #378368

#TimeUsernameProblemLanguageResultExecution timeMemory
378368MounirFancy Fence (CEOI20_fancyfence)C++14
100 / 100
205 ms14172 KiB
#include <bits/stdc++.h> #define int long long #define chmin(x, v) x = min(x, v) #define chmax(x, v) x = max(x, v) #define all(v) v.begin(), v.end() using namespace std; const int MOD = 1e9 + 7, N = 2e5; set<int> pasVisites; int nInters(int len){ return ((len * (len + 1))/2)%MOD; } int subSum(int n){ return ((n * (n+1))/2)%MOD; } struct Zone { int hauteur, largeur, ind; bool operator < (const Zone &autre) const { if (hauteur != autre.hauteur) return hauteur > autre.hauteur; return largeur < autre.largeur; } }; signed main(){ int nZones; cin >> nZones; vector<int> hauteurs(nZones), largeurs(nZones); for (int& hauteur : hauteurs) cin >> hauteur; for (int& largeur : largeurs) cin >> largeur; vector<Zone> zones, pastriees; for (int i = 0; i < nZones; ++i){ if (zones.size() == 0 || zones[zones.size() - 1].hauteur != hauteurs[i]) zones.push_back({hauteurs[i], 0, (int)zones.size()}); zones[zones.size() - 1].largeur = (zones[zones.size() - 1].largeur + largeurs[i])%MOD; } vector<int> cumul(zones.size()); for (int i = 0; i < (int)zones.size(); ++i){ cumul[i] = zones[i].largeur; if (i != 0) cumul[i] = (cumul[i] + cumul[i - 1])%MOD; pasVisites.insert(i); } pastriees = zones; sort(all(zones)); int sum = 0; for (Zone& zone : zones){ pasVisites.erase(zone.ind); auto it = pasVisites.upper_bound(zone.ind); int gauche = -1, droite = zones.size() - 1; if (it != pasVisites.end()) droite = *it - 1; if (it != pasVisites.begin()){ it--; gauche = *it; } int len = cumul[droite]; if (gauche != -1) len -= cumul[gauche]; len = (len + MOD)%MOD; /* Trouver la hauteur */ int maxi = 0; if (gauche != -1) chmax(maxi, pastriees[gauche].hauteur); if (droite + 1 < (int)zones.size())chmax(maxi, pastriees[droite + 1].hauteur); int s = subSum(zone.hauteur) - subSum(maxi); sum = (sum + nInters(len) * (s))%MOD; } cout << sum << endl; 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...