제출 #981130

#제출 시각아이디문제언어결과실행 시간메모리
981130aymanrsFish 3 (JOI24_fish3)C++14
28 / 100
228 ms56296 KiB
#include<bits/stdc++.h> using namespace std; struct que{ int l, r, id; }; void f(int l, int r, list<que>& v, long long a[], long long ans[], long long c[]){ if(l==r){ for(auto& i : v){ if(c[l] >= 0) ans[i.id] = 0; else ans[i.id]=-1; } return; } int m = l+r>>1; list<que> L, R, M; for(const que& i : v){ if(i.r <= m) L.push_back(i); else if(i.l > m) R.push_back(i); else M.push_back(i); } v.clear(); f(l, m, L, a, ans, c); f(m+1, r, R, a, ans, c); long long S = 0; vector<pair<long long, int>> p; stack<pair<long long, int>> s; long long fs[r-m], Fs[r-m]; for(int i = m+1;i <= r;i++){ if(i==m+1) Fs[i-m-1]=0; else Fs[i-m-1] = Fs[i-m-2]; if(a[i] <= 0) { S -= i*a[i]; long long k = -a[i]; while(!s.empty() && k){ if(k >= s.top().first) { k -= s.top().first; S -= s.top().first*s.top().second; s.pop(); } else { S -= k*s.top().second; s.top().first -= k; k = 0; break; } } Fs[i-m-1] += k; } else s.push({a[i], i}); fs[i-m-1] = S; } S = 0;long long g = 0; int pt = m; vector<array<long long, 3>> bs = {{0, 0, -1}}; for(auto& q : M){ while(pt > q.l){ if(a[pt] <= 0){ g -= a[pt]; S -= a[pt]*pt; } else { long long k = a[pt]; if(g >= k){ g -= k; S -= k*pt; pt--; continue; } S -= g*pt; k -= g; g = 0; bs.back()[2] = pt; bs.push_back({bs.back()[0]+k, bs.back()[1]-k*pt, -1}); } pt--; } long long k = c[pt]; if(g > k || k+bs.back()[0]-g < Fs[q.r-m-1]){ ans[q.id] = -1; continue; } if(!Fs[q.r-m-1]){ ans[q.id] = S-g*pt+fs[q.r-m-1]; continue; } bs.back()[2] = pt; int low = 0, high = bs.size()-1, best = 0; while(low<=high){ int mid = low+high>>1; if(bs[mid][0] >= Fs[q.r-m-1]) { high=mid-1; } else { best = mid; low = mid+1; } } ans[q.id] = S-g*pt+fs[q.r-m-1]+bs[best][1]-(Fs[q.r-m-1]-bs[best][0])*bs[best][2]; } } void solve(){ int n, d;cin >> n >> d; long long a[n+1], c[n+1];a[0]=0; for(int i = 1;i <= n;i++) { cin >> a[i]; c[i] = a[i]; } for(int i = n;i >= 1;i--) { a[i] = a[i]-a[i-1]; if(a[i] < 0){ a[i] = -a[i]; a[i] = (a[i]+d-1)/d; a[i] = -a[i]; } else a[i] /= d; if(c[i] < 0){ c[i] = -c[i]; c[i] = (c[i]+d-1)/d; c[i] = -c[i]; } else c[i] /= d; } int q;cin >> q; vector<que> qv; for(int i = 0;i < q;i++){ int l, r;cin >> l >> r; qv.push_back({l, r, i}); } sort(qv.begin(), qv.end(), [](const auto& a, const auto& b){ return a.l > b.l; }); long long ans[q]; list<que> lv(qv.begin(), qv.end()); f(1, n, lv, a, ans, c); for(int i = 0;i < q;i++) cout << ans[i] << '\n'; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); solve(); }

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'void f(int, int, std::__cxx11::list<que>&, long long int*, long long int*, long long int*)':
Main.cpp:14:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   14 |  int m = l+r>>1;
      |          ~^~
Main.cpp:87:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   87 |    int mid = low+high>>1;
      |              ~~~^~~~~
#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...