Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2)
F. Pairwise Modulo
You have an array a consisting of n distinct positive integers, numbered from 1 to n. Define pk as
You have to find and print p1,p2,…,pnp1,p2,…,pn.
时限4s
#include<bits/stdc++.h>
using namespace std;
const int maxn=300005;
//#define int long long
#define lowbit(x) x&(-x)
long long a1[500050];//树状数组
int a[500050];
int b[500100];
long long sum[500100];
long long ans[500000];
inline int read()
{
int res=0;
char c=getchar();
while(c<‘0‘||c>‘9‘)c=getchar();
while(c>=‘0‘&&c<=‘9‘)
{
res=(res<<1)+(res<<3)+c-‘0‘;
c=getchar();
}
return res;
}
void add(int x)
{
while(x<=maxn)
{
a[x]++;
x+=x&(-x);
}
}
int get(int x)
{
if(x<=0)return 0;
int ans=0;
while(x)
{
ans+=a[x];
x-=x&(-x);
}
return ans;
}
void add1(int x,int zhi)
{
while(x<=maxn)
{
a1[x]+=zhi;
x+=x&(-x);
}
}
long long get1(int x)
{
if(x<=0)return 0;
long long ans=0;
while(x)
{
ans+=a1[x];
x-=x&(-x);
}
return ans;
}
void print(long long x)
{
if(x>=10)print(x/10);
putchar(x%10+‘0‘);
}
signed main()
{
int ks=clock();
// freopen("std.in","r",stdin);
// freopen("std.out","w",stdout);
int n;
scanf("%d",&n);
int jx=0;
int timel=0;
for(int i=1;i<=n;i++)
{
b[i]=read();
sum[i]=sum[i-1]+b[i];
jx=max(jx,b[i]);
add(b[i]);
add1(b[i],b[i]);
int cnt=0;
int now=0;
for(int l=0,r;l<=jx;l=r+1)
{
if(now==i)break;
r=l+b[i]-1;
if(r>maxn)r=maxn;
int ans1=get(r)-get(l-1);
now+=ans1;
// timel++;
// cout<<l<<" "<<r<<" "<<get(l-1)<<" "<<get(r)<<"\n";
ans[i]-=1ll*b[i]*cnt*ans1;
cnt++;
}
now=0;
int limit=get1(b[i]-1);
int cs=0;
for(int l=1,r;l<=b[i];l=r+1)
{
if(now==limit)
{
cs=1;break;
}
r=b[i]/(b[i]/l);
int ans1=get1(r)-get1(l-1);
now+=ans1;
timel++;
// cout<<b[i]<<" "<<l<<" "<<r<<" "<<ans1<<"\n";
ans[i]-=1ll*b[i]/l*ans1;
}
ans[i]+=ans[i-1];
ans[i]+=sum[i-1];
ans[i]+=1ll*b[i]*i;
if(!cs)ans[i]+=b[i];
}
// for(int i=1;i<=n;i++)
// cout<<b[i]<<" ";cout<<"\n";
// for(int i=1;i<=n;i++)
// cout<<sum[i]<<" ";cout<<"\n";
for(int i=1;i<n;i++)
{
// printf("%lld ",ans[i]);
print(ans[i]);putchar(‘ ‘);
}
// printf("%lld\n",ans[n]);
print(ans[n]);putchar(‘\n‘);
int js=clock();
// cout<<ks-js<<"\n";
// cout<<timel<<"\n";
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int maxn=300005;
//#define int long long
#define lowbit(x) x&(-x)
long long a1[500050];//树状数组
int a[500050];
int b[500100];
long long sum[500100];
long long ans[500000];
inline int read()
{
int res=0;
char c=getchar();
while(c<‘0‘||c>‘9‘)c=getchar();
while(c>=‘0‘&&c<=‘9‘)
{
res=(res<<1)+(res<<3)+c-‘0‘;
c=getchar();
}
return res;
}
void add(int x)
{
while(x<=maxn)
{
a[x]++;
x+=x&(-x);
}
}
int get(int x)
{
if(x<=0)return 0;
int ans=0;
while(x)
{
ans+=a[x];
x-=x&(-x);
}
return ans;
}
void add1(int x,int zhi)
{
while(x<=maxn)
{
a1[x]+=zhi;
x+=x&(-x);
}
}
long long get1(int x)
{
if(x<=0)return 0;
long long ans=0;
while(x)
{
ans+=a1[x];
x-=x&(-x);
}
return ans;
}
void print(long long x)
{
if(x>=10)print(x/10);
putchar(x%10+‘0‘);
}
signed main()
{
int ks=clock();
// freopen("std.in","r",stdin);
// freopen("std.out","w",stdout);
int n;
scanf("%d",&n);
int jx=0;
int timel=0;
for(int i=1;i<=n;i++)
{
b[i]=read();
sum[i]=sum[i-1]+b[i];
jx=max(jx,b[i]);
add(b[i]);
for(int k=1;k*b[i]<=maxn;k++)
add1(k*b[i],b[i]);
int cnt=0;
int now=0;
for(int l=0,r;l<=jx;l=r+1)
{
if(now==i)break;
r=l+b[i]-1;
if(r>maxn)r=maxn;
int ans1=get(r)-get(l-1);
now+=ans1;
// timel++;
// cout<<l<<" "<<r<<" "<<get(l-1)<<" "<<get(r)<<"\n";
ans[i]-=1ll*b[i]*cnt*ans1;
cnt++;
}
now=0;
int cs=0;
int o=0;
ans[i]-=get1(b[i]);
// for(int l=1,r;l<=b[i];l=r+1)
// {
// if(now==limit)
// {
// cs=1;break;
// }
// r=b[i]/(b[i]/l);
// int ans1=get1(r)-get1(l-1);
// now+=ans1;
// o++;
//
// timel++;
//// cout<<b[i]<<" "<<l<<" "<<r<<" "<<ans1<<"\n";
// ans[i]-=1ll*b[i]/l*ans1;
// }printf("%d %d\n",b[i],o);
ans[i]+=ans[i-1];
ans[i]+=sum[i-1];
ans[i]+=1ll*b[i]*i;
if(!cs)ans[i]+=b[i];
}
// for(int i=1;i<=n;i++)
// cout<<b[i]<<" ";cout<<"\n";
// for(int i=1;i<=n;i++)
// cout<<sum[i]<<" ";cout<<"\n";
for(int i=1;i<n;i++)
{
printf("%lld ",ans[i]);
// print(ans[i]);putchar(‘ ‘);
}
printf("%lld\n",ans[n]);
// print(ans[n]);putchar(‘\n‘);
// int js=clock();
// cout<<ks-js<<"\n";
// cout<<timel<<"\n";
return 0;
}
原文:https://www.cnblogs.com/1427314831a/p/15048209.html