Submission #1136862

#TimeUsernameProblemLanguageResultExecution timeMemory
1136862panDungeon 3 (JOI21_ho_t5)C++20
0 / 100
2410 ms101248 KiB
#include <bits/stdc++.h> //#include "includeall.h" //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/tree_policy.hpp> #define endl '\n' #define f first #define s second #define pb push_back #define mp make_pair #define lb lower_bound #define ub upper_bound #define input(x) scanf("%lld", &x); #define input2(x, y) scanf("%lld%lld", &x, &y); #define input3(x, y, z) scanf("%lld%lld%lld", &x, &y, &z); #define input4(x, y, z, a) scanf("%lld%lld%lld%lld", &x, &y, &z, &a); #define print(x, y) printf("%lld%c", x, y); #define show(x) cerr << #x << " is " << x << endl; #define show2(x,y) cerr << #x << " is " << x << " " << #y << " is " << y << endl; #define show3(x,y,z) cerr << #x << " is " << x << " " << #y << " is " << y << " " << #z << " is " << z << endl; #define all(x) x.begin(), x.end() #define discretize(x) sort(x.begin(), x.end()); x.erase(unique(x.begin(), x.end()), x.end()); #define FOR(i, x, n) for (ll i =x; i<=n; ++i) #define RFOR(i, x, n) for (ll i =x; i>=n; --i) using namespace std; mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count()); //using namespace __gnu_pbds; //#define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> //#define ordered_multiset tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> typedef long long ll; typedef long double ld; typedef pair<ld, ll> pd; typedef pair<string, ll> psl; typedef pair<ll, ll> pi; typedef pair<pi, ll> pii; typedef pair<pi, pi> piii; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); ll const INF = 1e16; ll n, q; ll c[200005], b[200005], ans[200005], nxt[200005]; vector<pii> que[200005]; vector<ll> dis; ll find_idx(ll x) {return ub(all(dis), x)-dis.begin();} struct BIT { ll siz; vector<ll> fenwick; BIT(ll _size = 200100){siz = _size; fenwick.assign(_size, 0);} ll ps(ll i) { ll sum=0; while (i>0) { sum+=fenwick[i]; i-=i&(-i); } return sum; } void update(ll i, ll v) { while (i<siz) { fenwick[i]+=v; i+=i&(-i); } } void range_update(ll x, ll y, ll v) { update(x, v); update(y + 1, -v); } }g, t; struct node { int s, e, m; ll minn, maxx; node * l, * r; node(int S, int E) { s = S, e = E, m = (s + e) / 2; minn = INF, maxx = -INF; if (s != e) { l = new node(s, m); r = new node(m + 1, e); } } void update(int X, ll V) { if (s == e) minn = min(minn, V), maxx = max(maxx, V); else { if (X <= m) l -> update(X, V); else r -> update(X, V); minn = min(l -> minn, r -> minn); maxx = max(l->maxx, r->maxx); } } pi query_min(int S, int E) { if (s == S && e == E) return mp(minn, s); else if (E <= m) return l -> query_min(S, E); else if (S >= m + 1) return r -> query_min(S, E); else return min(l -> query_min(S, m), r -> query_min(m + 1, E)); } pi query_max(int S, int E) { if (s == S && e == E) return mp(maxx, s); else if (E <= m) return l -> query_max(S, E); else if (S >= m + 1) return r -> query_max(S, E); else return max(l -> query_max(S, m), r -> query_max(m + 1, E)); } }* minn, *maxx; int main() { cin >> n >> q; for (ll i=2; i<=n+1; ++i) cin >> c[i]; for (ll i=1; i<=n; ++i) cin >> b[i]; minn = new node(1, n + 5); maxx = new node(1, n + 5); g = BIT(), t = BIT(); for (ll i=1; i<=n; ++i) minn->update(i, b[i]); for (ll i=2; i<=n+1; ++i) maxx->update(i-1, c[i]); for (ll i=2; i<=n + 1; ++i) c[i] += c[i-1]; for (ll i=0; i<q; ++i) { ll u, v, m; cin >> u >> v >> m; if (maxx->query_max(u, v-1).f > m) ans[i] = -1; else { que[u].pb(mp(mp(m, 1), i)); ll seg = lb(c+1, c + n + 1, c[v] - m)-c; show(seg); show2(minn->query_min(max(u, seg), v-1).f, minn->query_min(max(u, seg), v-1).s); ll pos = minn->query_min(max(u, seg), v-1).s; // min position that will propagate to outside show(pos); que[pos].pb(mp(mp(m, -1), i)); ans[i] += (c[v] - c[pos])*b[pos]; dis.pb(m); } } dis.pb(INF); discretize(dis); deque<ll> dq; b[n+1] = -INF; dq.pb(n + 1); for (ll i=n; i>0; --i) { while ( b[dq.back()] >= b[i]) { ll now = dq.back(); ll x =find_idx(c[now] - c[i]), y = find_idx(c[nxt[now]] - c[i]); g.range_update(x + 1, y, -b[now]); t.range_update(x + 1, y, (c[now] - c[i])*b[now]); t.range_update(y + 1, dis.size(), -(c[nxt[now]] - c[now])*b[now]); dq.pop_back(); } nxt[i] = dq.back(); ll x = find_idx(c[nxt[i]] - c[i]); g.range_update(1, x, b[i]); t.range_update(x +1, dis.size(), (c[nxt[i]] - c[i])*b[i]); dq.pb(i); for (pii u: que[i]) { ll x = find_idx(u.f.f); ans[u.s] += u.f.s * ((g.ps(x)) * u.f.f + t.ps(x)); } } for (ll i=0; i<q; ++i) cout << ans[i] << 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...