Submission #855494

#TimeUsernameProblemLanguageResultExecution timeMemory
855494vjudge1Split the sequence (APIO14_sequence)C++17
49 / 100
46 ms131072 KiB
#include<bits/stdc++.h> #pragma GCC target( "sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native") #pragma GCC optimize("Ofast,unroll-loops,fast-math,O3") using namespace std; #define int long long #define y1 cheza mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int N=1e6+100; const int B=700; const int M=1e7+10; const int mod=1e9+7; const int INF=1e18; const long double eps=1e-8; const int dx[]={1,-1,0,0}; const int dy[]={0,0,-1,1}; const int debug=0; int n,k; int a[N]; int dp[N][5]; int pr[N][220]; int pref[N]; deque<int>v; bool left(int x,int y,int z){ return dp[y][0]-dp[x][0]>=(pref[y]-pref[x])*(pref[n]-pref[z]); } bool right(int x,int y,int z){ return (dp[y][0]-dp[x][0])*(pref[z]-pref[y])<=(dp[z][0]-dp[y][0])*(pref[y]-pref[x]); } void shrink(int x){ while(v.size()>1&&left(v[0],v[1],x)){ v.pop_front(); } } void add(int x){ while(v.size()>1&&right(v[v.size()-2],v[v.size()-1],x)){ v.pop_back(); } v.push_back(x); } void test(){ cin>>n>>k; for(int i=1;i<=n;i++){ cin>>a[i]; pref[i]=pref[i-1]+a[i]; } for(int kk=1;kk<=k;kk++){ v.push_back(0); for(int i=1;i<=n;i++){ shrink(i); dp[i][1]=dp[v.front()][0]+(pref[i]-pref[v.front()])*(pref[n]-pref[i]); pr[i][kk]=v.front(); add(i); } v.clear(); for(int i=1;i<=n;i++){ dp[i][0]=dp[i][1]; } // for(int i=1;i<=n;i++){ // cout<<dp[i][0]<<' '; // } // cout<<'\n'; // cout<<'\n'; } // A B C // k1=AC+BC // k1=AB+BC // k1=AB+AC // k2=AC+BC+AB // k2=AB+AC+BC // for(int i=1;i<=k;i++){ // for(int j=1;j<=n;j++){ // cout<<dp[j][i]<<' '; // } // cout<<'\n'; // } // for(int i=1;i<=k;i++){ // for(int j=1;j<=n;j++){ // cout<<pr[j][i]<<' '; // } // cout<<'\n'; // } // return; int mx=0; int cur=0; for(int i=1;i<=n;i++){ if(mx<=dp[i][0]){ mx=dp[i][0]; cur=i; } } vector<int>ans; ans.push_back(cur); for(int i=k;i>=2;i--){ cur=pr[cur][i]; ans.push_back(cur); } cout<<mx<<'\n'; reverse(ans.begin(),ans.end()); // sort(ans.begin(),ans.end()); for(auto i:ans){ cout<<i<<' '; } cout<<'\n'; } /* int y=dp[j][kk-1]+(pref[i]-pref[j])*(pref[n]-pref[i]); i ,j dp[i][kk]=min dp[j][kk-1] + (pref[i]-pref[j])*(pref[n]-pref[i]); dp[i][kk]=pref[i]*pref[n]-pref[i]*pref[i]; -pref[j]*(pref[n]-pref[i])+dp[j][kk-1]; */ signed main(){ // cout<<"HEllo\n"; // freopen("INPUT.TXT","r",stdin); // freopen("OUTPUT.TXT","w",stdout); ios_base::sync_with_stdio(false); cin.tie(nullptr); // cout.tie(nullptr); long long t2=1; // cin>>t2; // scanf("%lld",&t2); for(int i=1;i<=t2;i++){ // cout<<"Case "<<i<<": "; test(); } return 0; } /* temmie luck */
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...