Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- */
- //#pragma GCC optimize("O3")
- #define _CRT_SECURE_NO_WARNINGS
- #include <fstream>
- #include <iostream>
- #include <string>
- #include <complex>
- #include <math.h>
- #include <set>
- #include <vector>
- #include <map>
- #include <queue>
- #include <stdio.h>
- #include <stack>
- #include <algorithm>
- #include <list>
- #include <ctime>
- #include <memory.h>
- #include <assert.h>
- #define y0 sdkfaslhagaklsldk
- #define y1 aasdfasdfasdf
- #define yn askfhwqriuperikldjk
- #define j1 assdgsdgasghsf
- #define tm sdfjahlfasfh
- #define lr asgasgash
- #define norm asdfasdgasdgsd
- #define have adsgagshdshfhds
- #define ends asdgahhfdsfshdshfd
- #define eps 1e-8
- #define M_PI 3.141592653589793
- #define bsize 512
- #define ldouble long double
- using namespace std;
- #define bs 1000000007
- const int N = 600031;
- int n,ar[N];
- long long S[N];
- long long sparse_gcd[20][N],sparse_s[20][N],sparse_max[20][N];
- int gcd(int a,int b){
- b=abs(b);
- while (a&&b)a>b?a%=b:b%=a;
- return a+b;
- }
- vector<pair<long long, long long> > order;
- long long suf_max[N];
- int main(){
- // freopen("apache.in","r",stdin);
- // freopen("apache.out","w",stdout);
- //freopen("input.txt", "r", stdin);
- //freopen("output.txt", "w", stdout);
- ios_base::sync_with_stdio(0);
- // cin.tie(0);
- cin>>n;
- long long ttl=0;
- for (int i=1;i<=n;i++){
- cin>>ar[i];
- S[i]=S[i-1]+ar[i];
- }
- suf_max[n]=S[n];
- for (int i=n-1;i>=0;--i)
- suf_max[i]=max(suf_max[i+1],S[i]);
- long long ans=-1e18;
- order.clear();
- for (int i=1;i<=n;i++){
- order.push_back(make_pair(S[i],i));
- }
- sort(order.begin(),order.end());
- long long MX=order.back().first;
- srand(time(NULL));
- if (rand()%2)
- random_shuffle(order.begin(),order.end());
- for (int ii=0;ii<order.size();ii++){
- int i=order[ii].second;
- ttl=MX-order[ii].first;
- long long cur_gcd=0;
- int cur_max=-1e9;
- long long cur_s=0;
- for (int j=i;j<=n;j++){
- cur_gcd=gcd(cur_gcd,ar[j]);
- cur_max=max(cur_max,ar[j]);
- cur_s+=ar[j];
- long long here=cur_gcd*(cur_s-cur_max);
- if (cur_gcd*1ll*(suf_max[j]-order[ii].first)<=ans)
- break;
- if (here>ans)
- ans=here;
- }
- if (clock()*1.0/CLOCKS_PER_SEC>1.98)
- break;
- }
- cout<<ans<<endl;
- cin.get(); cin.get();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement