제출 #716875

#제출 시각아이디문제언어결과실행 시간메모리
716875vjudge1Split the sequence (APIO14_sequence)C++17
0 / 100
20 ms5972 KiB
#include <bits/stdc++.h> #define f first #define s second #define ent '\n' #define int long long #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #pragma GCC optimize("Ofast,unroll-loops,fast-math,O3") //typedef long double ld; typedef long long ll; using namespace std; struct node{double x,y;}; //double len(node a,node b) //{return sqrt((a.x-b.x)*(a.x-b.y)+(a.y-b.y)*(a.x-b.y));} struct seg{ int mx1=0,mx2=0,ans=0; }; const string out[2]={"NO\n","YES\n"}; const ll dx[]={0,0,1,-1,-1,1,1,-1}; const ll dy[]={1,-1,0,0,-1,1,-1,1}; const int md=998244353; const int mod=1e9+7; const int mx=1e6+12; const int tst=1e5; const bool T=0; int p[2012][2012]; int dp[2012][212]; int pref[mx]; int col[mx]; int q[mx]; int n,m,k; int ans=-1; bool kek; int pos; int get(int x){ int sum=0,cal=0,k=m; for(int i=1;i<=n;i++){ sum+=q[i]; if(sum>=x && k>0){ sum-=q[i]; cal+=(pref[n]-pref[i-1])*sum; sum=q[i]; k--; } } if(k>0)kek=1; if(cal>ans){ ans=cal; pos=x; } return cal; } void Press_Fn_with_F11(){ cin>>n>>m; int mx=0; for(int i=1;i<=n;i++)cin>>q[i],mx=max(mx,q[i]); for(int i=1;i<=n;i++)pref[i]=pref[i-1]+q[i]; int l=mx+1,r=1e9; if(n<=2000){ for(int i=0;i<=n;i++){ for(int j=0;j<=m;j++)dp[i][j]=-1e18; } dp[0][0]=0; for(int i=1;i<=n;i++){ for(int j=i;j<=n;j++){ for(int k=1;k<=min(i+1,m);k++){ dp[j][k]=max(dp[j][k],dp[i-1][k-1]+(pref[j]-pref[i-1])*(pref[n]-pref[j])); if(dp[j][k]==dp[i-1][k-1]+(pref[j]-pref[i-1])*(pref[n]-pref[j]))p[j][k]=i-1; } } } cout<<dp[n][m]<<ent; vector<int> ans; for(int i=n,j=m;j;j--){ ans.push_back(i); i=p[i][j]; } for(int i=ans.size()-1;i;i--)cout<<ans[i]<<' '; cout<<ent; return; } while(r-l>10){ int m1=l+(r-l)/3,m2=r-(r-l)/3; kek=0; int a=get(m1),b=get(m2); if(kek)r=m2-1; else if(get(m1)>get(m2))r=m2-1; else l=m1+1; } for(int i=l;i<=r;i++)get(i); int sum=0,k=m; int cnt=1; for(int i=1;i<=n;i++){ sum+=q[i]; col[i]=cnt; if(sum>=pos && k>0){ col[i]=++cnt; sum=q[i]; k--; } } if(k>0){ while(k--){ int mx=0; for(int i=1;i<=n;i++){ int j=i; while(j<n && col[j+1]==col[i])j++; for(int k=i;k<=j;k++)mx=max(mx,(pref[k]-pref[i-1])*(pref[j]-pref[k])); i=j; } bool ok=0; for(int i=1;i<=n;i++){ int j=i; while(j<n && col[j+1]==col[i])j++; for(int k=i;k<=j;k++){ if(mx==(pref[k]-pref[i-1])*(pref[j]-pref[k])){ cnt++; ok=1; for(int l=i;l<=k;l++)col[l]=cnt; break; } } if(ok)break; i=j; } ans+=mx; } } cout<<ans<<ent; for(int i=1;i<n;i++){ if(col[i]!=col[i+1])cout<<i<<' '; } cout<<ent; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int Ersayin_abi_crush=1; if(T)cin>>Ersayin_abi_crush; for(int i=1;i<=Ersayin_abi_crush;i++){ // cout<<"Case "<<i<<": "; Press_Fn_with_F11(); } }

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

sequence.cpp: In function 'void Press_Fn_with_F11()':
sequence.cpp:92:7: warning: unused variable 'a' [-Wunused-variable]
   92 |   int a=get(m1),b=get(m2);
      |       ^
sequence.cpp:92:17: warning: unused variable 'b' [-Wunused-variable]
   92 |   int a=get(m1),b=get(m2);
      |                 ^
#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...