# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1248190 | kokokai | Bigger segments (IZhO19_segments) | C++20 | 56 ms | 13896 KiB |
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define fi first
#define se second
const int N = 5e5+4;
int a[N];
pair<ll,ll> dp[N];
ll pre[N];
int main(){
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
if(fopen("text.inp","r")){
freopen("text.inp","r",stdin);
//freopen("text.out","w",stdout);
}
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
reverse(a+1,a+1+n);
for(int i=1;i<=n;i++) pre[i]=pre[i-1]+a[i];
//dp[i][j]=min phan cuoi khi chon i->n va used j
for(int i=1;i<=n;i++){
dp[i]={9e17,0};
}
dp[n+1]={0,0};
for(int i=n+1;i>=1;i--){
if(i<=n){
if(dp[i].fi > dp[i+1].fi+a[i]){
dp[i].fi=dp[i+1].fi+a[i];
dp[i].se=dp[i+1].se;
}else if(dp[i].fi == dp[i+1].fi+a[i]){
dp[i].se=max(dp[i].se,dp[i+1].se);
}
}
ll sum=dp[i].fi;
int l=0,r=i-2,an=-1;
while(l<=r){
int mid=(l+r)>>1;
if(pre[i-1]-pre[mid] >= sum){
an=mid;
l=mid+1;
}else{
r=mid-1;
}
}
if(an == -1) continue;
ll nsum=pre[i-1]-pre[an];
an++;
if(dp[an].fi == nsum){
dp[an].se=max(dp[an].se,dp[i].se+1);
}else if(dp[an].fi > nsum){
dp[an].fi=nsum;
dp[an].se=dp[i].se+1;
}
}
for(int i=n+1;i>=1;i--){
//cerr<<i<<' '<<dp[i].fi<<' '<<dp[i].se<<'\n';
}
int ans=dp[1].se;
cout<<ans<<'\n';
}
컴파일 시 표준 에러 (stderr) 메시지
# | 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... |