Educational Codeforces Round 65 F. Scalar Queries

链接

https://codeforces.com/contest/1167/problem/F

题解

先假设每个数的系数总是 1 1 1,那么答案就是 ∑ i = 1 n a i i ( n − i + 1 ) \sum_{i=1}^na_ii(n-i+1) i=1naii(ni+1)
然后对于每个数,它会使得比它大的数字的系数在某些区间增加 1 1 1
比如 a x &gt; a y a_x&gt;a_y ax>ay x &lt; y x&lt;y x<y时,应该 a n s + = x a x ( n − y + 1 ) ans+=xa_x(n-y+1) ans+=xax(ny+1)
树状数组辅助求和

代码

#include<bits/stdc++.h>
#define maxn 500010
#define linf (1ll<<60)
#define iinf 0x3f3f3f3f
#define eps 1e-8
#define cl(x) memset(x,0,sizeof(x))
#define mod 1000000007ll
using namespace std;
typedef long long ll;
ll read(ll x=0)
{
	int c, f=1;
	for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
	for(;isdigit(c);c=getchar())x=x*10+c-48;
	return f*x;
}
struct BIT
{
    ll bit[maxn], n;
    void clear(){cl(bit);n=0;}
    ll lowbit(ll x){return x&(-x);}
    void add(ll pos, ll v)
    {
        for(;pos<=n;pos+=lowbit(pos))bit[pos]=(bit[pos]+v)%mod;
    }
    ll sum(ll pos)
    {
        ll ans(0);
        for(;pos;pos-=lowbit(pos))ans=(ans+bit[pos])%mod;
        return ans;
    }
}bit;
ll N, a[maxn], ans, tmp[maxn];
ll index(ll x)
{
    return lower_bound(tmp+1,tmp+N+1,x)-tmp;
}
int main()
{
	ll i;
    N=read();
    for(i=1;i<=N;i++)tmp[i]=a[i]=read(), ans=(ans+a[i]*i%mod*(N-i+1))%mod;
    sort(tmp+1,tmp+N+1);
    bit.clear();
    bit.n=N;
    for(i=1;i<=N;i++)
    {
        ans+=(bit.sum(N)-bit.sum(index(a[i])))%mod*(N-i+1);
        ans%=mod;
        bit.add(index(a[i]),a[i]*i%mod);
    }
    bit.clear();
    bit.n=N;
    for(i=N;i;i--)
    {
        ans+=(bit.sum(N)-bit.sum(index(a[i])))%mod*i;
        ans%=mod;
        bit.add(index(a[i]),a[i]*(N-i+1)%mod);
    }
    printf("%lld",(ans+mod)%mod);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值