Submission #682698

#TimeUsernameProblemLanguageResultExecution timeMemory
682698flappybirdFire (JOI20_ho_t5)C++17
1 / 100
1084 ms52844 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3") #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #pragma GCC target("avx,avx2,fma") using namespace std; typedef long long ll; typedef pair<ll, ll> pll; typedef pair<int, int> pii; #define MAX 201010 #define MAXS 20 #define INF 1000000000000000001 #define bb ' ' #define ln '\n' #define Ln '\n' typedef pair<pll, pll> T; pll operator+(pll p1, pll p2) { return pll(p1.first + p2.first, p1.second + p2.second); } T operator+(T p1, T p2) { return T(p1.first + p2.first, p1.second + p2.second); } pll operator-(pll p1, pll p2) { return pll(p1.first - p2.first, p1.second - p2.second); } T operator-(T p1, T p2) { return T(p1.first - p2.first, p1.second - p2.second); } struct fenwick { vector<T> tree; int N; fenwick(int N) :N(N) { tree.resize(N + 1); } void upd(int i, T x) { while (i <= N) { tree[i] = tree[i] + x; i += i & -i; } } T get(int i) { T ans({ 0, 0 }, { 0, 0 }); while (i) { ans = ans + tree[i]; i -= i & -i; } return ans; } }; vector<pair<int, pll>> del[MAX]; int arr[MAX]; int l[MAX]; int r[MAX]; int last[MAX]; vector<tuple<int, int, int>> qv[MAX]; T line[MAX]; ll ans[MAX]; signed main() { ios::sync_with_stdio(false), cin.tie(0); int N, Q; cin >> N >> Q; int i; for (i = 1; i <= N; i++) cin >> arr[i]; vector<pii> stk = { { 1e9 + 10, 0 } }; for (i = 1; i <= N; i++) r[i] = N + 1; for (i = 1; i <= N; i++) { while (stk.back().first < arr[i]) { r[stk.back().second] = i; stk.pop_back(); } l[i] = stk.back().second; stk.emplace_back(arr[i], i); } for (i = 1; i <= N; i++) { del[0].emplace_back(i, pll(1, arr[i])); if (l[i]) { del[i - l[i]].emplace_back(i, pll(-1, -arr[i])); del[r[i] - l[i]].emplace_back(i, pll(1, arr[i])); } del[r[i] - i].emplace_back(i, pll(-1, -arr[i])); } int low, high, t; for (i = 1; i <= Q; i++) { cin >> t >> low >> high; qv[t].emplace_back(low, high, i); } fenwick bit(N); auto get = [&](int i, int t) { if (i < 1) return 0ll; int l, r; l = 0; r = N + 1; while (r - l > 1) { int mid = (l + r) / 2; auto res = bit.get(mid); if (t * res.first.first + res.first.second > i) r = mid; else l = mid; } auto res = bit.get(l); int ind = t * res.first.first + res.first.second; return 1ll * arr[l + 1] * (i - res.first.first * t - res.first.second) + res.second.first * t + res.second.second; }; for (i = 0; i <= N; i++) { for (auto& [loc, p] : del[i]) { T pv = line[loc]; auto& [a, b] = line[loc].first; auto& [c, d] = line[loc].second; a = line[loc].first.first; b = line[loc].first.second; ll y = a * i + b; y += p.first; a += p.first; b = y - a * i; c = line[loc].second.first; d = line[loc].second.second; y = c * i + d; y += p.second; c += p.second; d = y - c * i; bit.upd(loc, line[loc] - pv); } for (auto& [l, r, n] : qv[i]) ans[n] = get(r, i) - get(l - 1, i); } for (i = 1; i <= Q; i++) cout << ans[i] << ln; }

Compilation message (stderr)

ho_t5.cpp: In lambda function:
ho_t5.cpp:92:7: warning: unused variable 'ind' [-Wunused-variable]
   92 |   int ind = t * res.first.first + res.first.second;
      |       ^~~
#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...