从2e5-1依次枚举每个数作为主显卡,然后分段求比它大的数的个数,这里的复杂度是调和级数ln2e5,即埃氏筛的复杂度、、
#include<bits/stdc++.h> using namespace std; #define ll long long #define N 200005 int cnt[N],n; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 ll num[N<<2]; void update(int pos,int v,int l,int r,int rt){ if(l==r){ num[rt]+=v; return; } int m=l+r>>1; if(pos<=m)update(pos,v,lson); else update(pos,v,rson); num[rt]=num[rt<<1]+num[rt<<1|1]; } ll query(int L,int R,int l,int r,int rt){ if(L<=l && R>=r){ return num[rt]; } int m=l+r>>1; ll res=0; if(L<=m)res+=query(L,R,lson); if(R>m)res+=query(L,R,rson); return res; } int main(){ cin>>n; for(int i=1;i<=n;i++){ int x;scanf("%d",&x); cnt[x]++; } ll ans=0; for(ll i=200000;i>=1;i--)if(cnt[i]){ ll tmp=0; update(i,cnt[i],1,200000,1); for(ll j=1;j*i<=200000;j++) tmp+=query(j*i,min(200000ll,(j+1)*i-1),1,200000,1)*i*j; ans=max(ans,tmp); } cout<<ans<<endl; }
原文:https://www.cnblogs.com/zsben991126/p/11440213.html