埃氏筛+线段树——cf731F
Posted zsben991126
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了埃氏筛+线段树——cf731F相关的知识,希望对你有一定的参考价值。
从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;
以上是关于埃氏筛+线段树——cf731F的主要内容,如果未能解决你的问题,请参考以下文章