이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pii;
const int N = 5e5+10;
const int K = 20;
const ll INF = 1e18;
ll a[N], p[N], x[N], lg[N], st[K][N], dp[N], n;
ll que(int l, int r) {
int i=lg[l-r+1];
return min(st[i][l], st[i][r+(1<<i)-1]);
}
int main() {
cin>>n;
for (int i=1; i<=n; ++i) cin>>a[i], p[i]=p[i-1]+a[i];
lg[1]=0;
for (int i=2; i<N; ++i) lg[i]=lg[i/2]+1;
for (int i=1; i<=n; ++i) {
for (int j=0; j<K; ++j) st[j][i]=INF;
}
for (int j=1; j<K; ++j) st[j][1]=0;
st[0][1]=2*p[1], dp[1]=1, x[1]=2*p[1];
for (int i=2; i<=n; ++i) {
int l=1, r=i-1, res=0;
while (l <= r) {
int m=(l+r)/2;
if (que(i-1, m) <= p[i]) l=m+1, res=m;
else r=m-1;
} x[i]=p[i]-p[res]+p[i];
dp[i]=dp[res]+1;
st[0][i]=x[i];
for (int j=1; j<K; ++j) {
st[j][i]=min(st[j-1][i], i-(1<<(j-1)) >= 0 ? st[j-1][i-(1<<(j-1))] : 0);
}
}
cout<<dp[n]<<"\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |