Submission #1282885

#TimeUsernameProblemLanguageResultExecution timeMemory
1282885kzhiFancy Fence (CEOI20_fancyfence)C++20
12 / 100
2 ms576 KiB
/* Author : kmv__ muadongdenroi, emcodencungmuadongkhong :< Road to tst */ #include<bits/stdc++.h> using namespace std; #define left(id) (id << 1) #define right(id) ((id << 1) | 1) #define mid(l,r) ((l + r) >> 1) const int N = 1e5 + 5; const int MOD = 1e9 + 7; int n, h[N], w[N]; int l[N], r[N]; long long t[N]; struct DATA{ int id, val; }; bool cmp(DATA A, DATA B){ return A.val < B.val; } vector < DATA > a; int calc(long long len){ if (len == 0) return 0; __int128 res; res = (len - 1) * len; res /= 2; res += len; res %= MOD; return (int) res; } long long st[N * 4], lz[N * 4]; void down(int id, int l, int r){ if (lz[id] == 0) return; long long x = lz[id]; lz[id] = 0; if (l != r){ int mid = mid(l, r); st[left(id)] = (1ll * x * (mid - l + 1)) % MOD; st[right(id)] = (1ll * x * (r - mid)) % MOD; lz[left(id)] = x; lz[right(id)] = x; } } void upd(int id, int l, int r, int u, int v, int val){ if (v < l || r < u) return; down(id, l, r); if (u <= l && r <= v){ st[id] = (1ll * val * (r - l + 1)) % MOD; lz[id] = val; down(id, l, r); return; } int mid = mid(l, r); upd(left(id), l, mid, u, v, val); upd(right(id), mid + 1, r, u, v, val); st[id] = (st[left(id)] + st[right(id)]) % MOD; } long long Get(int id, int l, int r, int u, int v){ if (v < l || r < u) return 0; down(id, l, r); if (u <= l && r <= v) return st[id]; int mid = mid(l, r); return (Get(left(id), l, mid, u, v) + Get(right(id), mid + 1, r, u, v)) % MOD; } long long sum(int l, int r){ long long res = t[r] - t[l - 1]; return res; } void SOLVE(){ cin >> n; for (int i = 1; i <= n; i ++) cin >> h[i]; for (int i = 1; i <= n; i ++){ cin >> w[i]; t[i] = t[i - 1] + w[i]; } stack < int > st1; st1.push(0); for (int i = 1; i <= n; i ++){ while (h[st1.top()] >= h[i]) st1.pop(); l[i] = st1.top() + 1; st1.push(i); } stack < int > st2; st2.push(n + 1); for (int i = n; i >= 1; i --){ while (h[st2.top()] >= h[i]) st2.pop(); r[i] = st2.top() - 1; st2.push(i); } for (int i = 1; i <= n; i++){ a.push_back({i, h[i]}); } sort(a.begin(), a.end(), cmp); long long ans = 0; for (DATA i : a){ int id = i.id; int val = i.val; long long len = sum(l[id], r[id]); long long res = 1ll * calc(len) * calc(val) % MOD; long long len2 = Get(1, 1, n, id, id); long long res2 = 1ll * calc(len2) * calc(len) % MOD; // cout << id << " " << l[id] << " " << r[id] << " " // << val << " " << len << " " << res // << " " << len2 << " " << res2 << endl; res -= res2; if (res < 0) res += MOD; ans += res; ans %= MOD; upd(1, 1, n, l[id], r[id], val); } cout << ans; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define TASK "hist" if (fopen(TASK".inp","r")){ freopen(TASK".inp","r",stdin); freopen(TASK".out","w",stdout); } int nTest = 1; // cin >> nTest; while (nTest --){ SOLVE(); } return 0; }

Compilation message (stderr)

fancyfence.cpp: In function 'int main()':
fancyfence.cpp:179:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  179 |         freopen(TASK".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
fancyfence.cpp:180:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  180 |         freopen(TASK".out","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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...