10.27 周五讲题 - Virtual Judge (vjudge.net)
至于查询(l,r)区间有多少个取值这种事交给权值线段树或者树状数组就好了
ac代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
const int mod=998244353;
int a[N];
#define int long long
#define lson pos<<1
#define rson pos<<1|1
int tree[N];
struct {
ll c[N];
void add(int x,int v) {
while (x <= N-10) { // 不能越界
c[x] +=v;
x = x + lowbit(x);
}
}
int getsum(int x) { // a[1]..a[x]的和
int ans = 0;
while (x > 0) {
ans = ans + c[x];
x = x - lowbit(x);
}
return ans;
}
int lowbit(int x) {
return x & -x;
}
} t,ts;
ll p[N],sum=0;
void solve() {
int n;
cin>>n;
for(int i=1; i<=n; i++)cin>>a[i];
ll res=0;
a[0]=0;
for(int i=1; i<=n; i++) {
res+=sum;
sum+=a[i];
res+=1ll*a[i]*(i-1);
// cout<<"|"<<res<<endl;
for(int k=1; k<=(3e5+10)/a[i]; k++) {
int L=k*a[i],R=min(((k+1)*a[i]-1),(int)3e5);
res-=(t.getsum(R)-t.getsum(L-1))*k*a[i];
}
t.add(a[i],1);
res-=ts.getsum(a[i]);
for(int j=a[i]; j<=3e5; j+=a[i])ts.add(j,a[i]);
cout<<res<<' ';
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
// init();
int t=1;
while(t--)solve();
}
/*
3 2
8 6 10
*/