求助卡常
查看原帖
求助卡常
549855
Limie楼主2024/6/9 19:40
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops")
#pragma target("avx,avx2,avx256f,sse2,sse3,sse4,sse4.2")
using namespace std;
int n,mx;
int a[100010],tr[100010],pre[100010],l[100010];
int rs[100010],r[100010],v[100010];
long long ans[100010];
bool st[100010];
inline void add1(int x,int y)
{
    for(;x<=mx;x+=x&-x)tr[x]=max(tr[x],y);
}
inline void add2(int x,int y)
{
    for(;x<=mx;x+=x&-x)tr[x]=min(tr[x],y);
}
inline int ask1(int x)
{
    int s=0;
    for(;x;x-=x&-x)s=max(s,tr[x]);
    return s;
}
inline int ask2(int x)
{
    int s=n+1;
    for(;x;x-=x&-x)s=min(s,tr[x]);
    return s;
}
inline void add(int v,int x,int y)
{
    if(st[y])return;
    st[y]=1;
    ans[y]-=(y-1==0)?0:(long long)v*(x+y-2)/(y-1);
    ans[y]+=(long long)v*(x+y-1)/y;
}
signed main()
{
	int i;
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
    cin>>n;
    for(i=1;i<=n;++i)cin>>a[i],mx=max(mx,a[i]);
    for(i=1;i<=n;++i){
        v[i]++;
        l[i]=ask1(a[i]-1);
		pre[i]=a[l[i]];
        add1(a[i],i);
    }
    for(i=1;i<=mx;++i)tr[i]=n+1;
    for(i=n;i>=1;--i){
        r[i]=ask2(a[i]);
		rs[i]=a[r[i]];
        add2(a[i],i);
        if(pre[i]>=rs[i])v[l[i]]--;else v[r[i]]--;
    }
    for(i=1;i<=n;++i){
        int x=a[i],l,r;
        l=1;
        while(l<=x){
        	r=x/(x/l);
        	add(v[i],a[i],r),add(v[i],a[i],r+1);
        	l=r+1;
		}
		l=1;
		while(l<=x){
        	r=x/(x/l);
        	st[r]=st[r+1]=0;
        	l=r+1;
		}
    }
    for(i=1;i<=mx;++i){
        ans[i]+=ans[i-1];
        cout<<ans[i]<<' ';
    }
}
2024/6/9 19:40
加载中...