제출 #1200173

#제출 시각아이디문제언어결과실행 시간메모리
1200173janson0109Fish 3 (JOI24_fish3)C++20
100 / 100
668 ms76032 KiB
#include <bits/stdc++.h> #define int long long #define f first #define s second using namespace std; signed main() { int n, k; cin >> n >> k; vector<int> v(n+1), a(n+1), c(n+1); for(int i=0;i<n;i++) cin >> v[i+1]; for(int i=n-1;i>0;i--) a[i] = max(0LL,(v[i]-v[i+1]+a[i+1]*k+k-1)/k); priority_queue<pair<int,int>> pq; a[0] = -1; for(int i=n;i>=0;i--) { pq.push({a[i],i}); while(pq.top().f > a[i]) {c[pq.top().s] = i; pq.pop();} } vector<vector<int>> adj(n+1, vector<int>(19,-1)); for(int i=0;i<=n;i++) adj[i][0] = c[i]; for(int i=1;i<19;i++) for(int j=0;j<=n;j++) adj[j][i] = adj[adj[j][i-1]][i-1]; vector<int> p(n+1), q(n+1); for(int i=1;i<=n;i++) p[i] = p[c[i]] + a[i]*(i-c[i]), q[i] = q[i-1]+a[i]; int _; cin >> _; while(_--) { int l, r; cin >> l >> r; int z = r; for(int i=18; i>=0; i--) if(adj[z][i] >= l) z = adj[z][i]; if(v[l]-(a[l]-a[z])*k < 0) cout << "-1\n"; else cout << q[r]-q[l-1]-(p[r]-p[z]+a[z]*(z-l+1)) << '\n'; } }
#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...