Submission #1248190

#TimeUsernameProblemLanguageResultExecution timeMemory
1248190kokokaiBigger segments (IZhO19_segments)C++20
100 / 100
56 ms13896 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';

}

Compilation message (stderr)

segments.cpp: In function 'int main()':
segments.cpp:13:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   13 |         freopen("text.inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#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...