.
题目点这里
大概是这么一个问题
∑
k
=
1
n
∑
i
=
1
n
−
k
+
1
∑
j
=
i
+
k
−
1
n
区
间
前
k
大
元
素
和
\sum_{k=1}^n\sum_{i=1}^{n-k+1}\sum_{j=i+k-1}^n区间前k大元素和
k=1∑ni=1∑n−k+1j=i+k−1∑n区间前k大元素和
观察式子并加以变形
=
∑
i
=
1
n
∑
j
=
i
n
∑
k
=
1
j
−
i
+
1
区
间
前
k
大
元
素
和
=\sum_{i=1}^n\sum_{j=i}^n\sum_{k=1}^{j-i+1}区间前k大元素和
=i=1∑nj=i∑nk=1∑j−i+1区间前k大元素和
=
∑
i
=
1
n
∑
j
=
i
n
∑
k
=
i
j
a
[
k
]
∗
∑
l
=
i
j
[
a
[
l
]
≤
a
[
k
]
]
=\sum_{i=1}^n\sum_{j=i}^n\sum_{k=i}^ja[k]*\sum_{l=i}^j[a[l]\le a[k]]
=i=1∑nj=i∑nk=i∑ja[k]∗l=i∑j[a[l]≤a[k]]
=
∑
i
=
1
n
∑
j
=
i
n
∑
k
=
i
j
a
[
k
]
∗
(
1
+
∑
l
=
i
j
[
a
[
l
]
<
a
[
k
]
]
)
=\sum_{i=1}^n\sum_{j=i}^n\sum_{k=i}^ja[k]*(1+\sum_{l=i}^j[a[l]<a[k]])
=i=1∑nj=i∑nk=i∑ja[k]∗(1+l=i∑j[a[l]<a[k]])
到了这里我们需要稍微考虑一下式子的意义
对于一对
i
,
j
(
i
<
j
)
i,j(i<j)
i,j(i<j)假如有
a
[
i
]
>
a
[
j
]
a[i]>a[j]
a[i]>a[j]那么这一对
i
,
j
i,j
i,j对答案的贡献是多少
应该是
a
[
i
]
∗
i
∗
(
n
−
j
+
1
)
a[i]*i*(n-j+1)
a[i]∗i∗(n−j+1)(
[
i
,
j
]
[i,j]
[i,j]这个区间被
a
[
i
]
∗
i
∗
(
n
−
j
+
1
)
a[i]*i*(n-j+1)
a[i]∗i∗(n−j+1)个区间所包含)
同理如果
a
[
j
]
>
a
[
i
]
a[j]>a[i]
a[j]>a[i]那么贡献就是
a
[
j
]
∗
i
∗
(
n
−
j
+
1
)
a[j]*i*(n-j+1)
a[j]∗i∗(n−j+1)
算上原来式子里有一个
1
1
1就得到下面这样的式子
=
∑
i
=
1
n
(
a
[
i
]
∗
i
∗
(
n
−
i
+
1
)
+
=\sum_{i=1}^n(a[i]*i*(n-i+1)+
=i=1∑n(a[i]∗i∗(n−i+1)+
∑
j
=
i
n
i
∗
(
n
−
j
+
1
)
∗
(
a
[
i
]
∗
[
a
[
i
]
<
a
[
j
]
]
+
a
[
j
]
∗
[
a
[
j
]
>
a
[
i
]
]
)
)
\sum_{j=i}^n i*(n-j+1)*(a[i]*[a[i]<a[j]]+a[j]*[a[j]>a[i]]))
j=i∑ni∗(n−j+1)∗(a[i]∗[a[i]<a[j]]+a[j]∗[a[j]>a[i]]))
把他拆成三个部分就是
∑
i
=
1
n
(
a
[
i
]
∗
i
∗
(
n
−
i
+
1
)
\sum_{i=1}^n(a[i]*i*(n-i+1)
i=1∑n(a[i]∗i∗(n−i+1)
∑
i
=
1
n
∑
j
=
i
n
i
∗
(
n
−
j
+
1
)
∗
a
[
j
]
∗
[
a
[
j
]
>
a
[
i
]
]
\sum_{i=1}^n\sum_{j=i}^n i*(n-j+1)*a[j]*[a[j]>a[i]]
i=1∑nj=i∑ni∗(n−j+1)∗a[j]∗[a[j]>a[i]]
∑
i
=
1
n
∑
j
=
i
n
i
∗
(
n
−
j
+
1
)
∗
a
[
i
]
∗
[
a
[
j
]
<
a
[
i
]
]
\sum_{i=1}^n\sum_{j=i}^n i*(n-j+1)*a[i]*[a[j]<a[i]]
i=1∑nj=i∑ni∗(n−j+1)∗a[i]∗[a[j]<a[i]]
第一个不用求
第二个可以这样变形
∑
j
=
1
n
(
n
−
j
+
1
)
∗
a
[
j
]
∑
i
=
1
j
i
∗
[
a
[
j
]
>
a
[
i
]
]
\sum_{j=1}^n(n-j+1)*a[j]\sum_{i=1}^j i*[a[j]>a[i]]
j=1∑n(n−j+1)∗a[j]i=1∑ji∗[a[j]>a[i]]
可以用排序+树状数组解决
第三个一样的
贴个
c
o
d
e
code
code吧
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 1000010
#define LL long long
#define M 1000000007
using namespace std;
int n,s[N],B,C,r[N]; LL A=0;
struct fenwick{
LL w[N],S;
inline void clr(){ memset(w,0,sizeof w); }
inline void add(int x,int k){ for(;x<=n;x+=x&-x) w[x]+=k; }
inline LL sum(int x){ for(S=0;x;x&=x-1) S=(S+w[x])%M; return S; }
} w;
inline bool c1(int i,int j){ return s[i]<s[j]; }
int main(){
scanf("%d%d%lld%d%d",&n,s+1,&A,&B,&C); r[1]=1;
for(int i=2;i<=n;++i) s[r[i]=i]=((LL)s[i-1]*A+B)%C;
sort(r+1,r+1+n,c1); A=0;
for(int i=1,j;i<=n;++i){
j=r[i];
A=(A+w.sum(j)*s[j]%M*(n-j+1)%M)%M;
w.add(j,j);
}
w.clr();
for(int i,j=1;j<=n;++j){
i=r[j];
A=(A+(w.sum(n)-w.sum(i))*s[i]%M*i%M)%M;
w.add(i,n-i+1);
}
for(int i=1;i<=n;++i) A=(A+(LL)s[i]*i%M*(n-i+1)%M)%M;
printf("%lld\n",A);
}