Submission #922050

#TimeUsernameProblemLanguageResultExecution timeMemory
922050AlebnFancy Fence (CEOI20_fancyfence)C++14
73 / 100
24 ms6228 KiB
#include <bits/stdc++.h> #define int long long #define sz(x) (int)(x.size()) using namespace std; const int mod=1000000007; int MOD(int x) { return (x+3*mod)%mod; } struct sections { int H=0, W=0; }; int n, k, m; vector<sections> a; int section(int h, int w) { h%=mod, w%=mod; int facteur=MOD((h*(h+1))/2); int ans=MOD((w*(w+1))/2); return MOD(ans*facteur); } int subtask2() { int ans=0; for (int i=0; i<n; i++) ans=MOD(ans+a[i].W); ans=MOD((ans*(ans+1))/2); for (int i=0; i<n; i++) { if (a[i].H==1) continue; ans=MOD(ans+section(1, a[i].W)*2); } return ans; } int subtask4() { int L=0; for (int i=0; i<n; i++) L+=a[i].W; int ans=0; for (int i=0; i<n; i++) { int sec=section(a[i].H, L); if (i) sec-=section(a[i-1].H, L); L-=a[i].W; ans=MOD(ans+MOD(sec)); } return ans; } int subtask5() { int ans=0; for (int i=0; i<n; i++) { int mini=a[i].H; int sum=a[i].W; ans=MOD(ans+section(a[i].W, a[i].H)); //i=j for (int j=i+1; j<n; j++) { //i!=j mini=min(mini, a[j].H); int res=section(mini, sum); // toute la section entre i et j res-=MOD(section(mini, sum-a[i].W)+section(mini, sum-a[j].W)); // j'enlève tous les points qui ne commencent pas res=MOD(res); // par j ou par i res+=section(mini, sum-a[i].W-a[j].W); // je rajoute ce que j'ai enlevé de trop (a+b)^2 ans=MOD(ans+MOD(res)); } } return ans; } int solve() { cin >> n; a.clear(); a.resize(n); bool sub2=true; for (auto &u: a) { cin >> u.H; if (u.H>2) sub2=false; } for (auto &u: a) { cin >> u.W; } vector<sections> temp; for (int i=0; i<n; i++) { if (!temp.empty() && a[i].H==temp.back().H) temp.back().W+=a[i].W; else temp.push_back(a[i]); } a.clear(); a=temp; n=a.size(); if (sub2) return subtask2(); if (n<=1000) return subtask5(); return subtask4(); } signed main() { ios::sync_with_stdio(0); cin.tie(0); cout << solve() << 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...