题目链接
直接算每对
i
,
j
i,j
i,j的贡献,发现每次操作只会对
4
n
4n
4n对的值有影响,其他都是
∗
2
*2
∗2,于是把方案数改为期望即可,效率
O
(
n
2
+
n
q
)
O(n^{2}+nq)
O(n2+nq)。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll P=1e9+7,V=(P+1)>>1;
const int N=3005;
int n,q,a[N]; ll f[N][N],g[N][N],ans,s=1;
int main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
cin>>n>>q;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){
f[i][j]=(a[i]<a[j]); g[i][j]=(a[i]>a[j]);
}
while(q--){
int x,y; scanf("%d%d",&x,&y);
f[x][y]=f[y][x]=(f[x][y]+f[y][x])*V%P;
g[x][y]=g[y][x]=(g[x][y]+g[y][x])*V%P;
for(int i=1;i<=n;i++) if(i!=x && i!=y){
f[x][i]=f[y][i]=(f[x][i]+f[y][i])*V%P;
g[x][i]=g[y][i]=(g[x][i]+g[y][i])*V%P;
f[i][x]=f[i][y]=(f[i][x]+f[i][y])*V%P;
g[i][x]=g[i][y]=(g[i][x]+g[i][y])*V%P;
}
(s*=2)%=P;
}
for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) (ans+=g[i][j])%=P;
cout<<ans*s%P<<endl;
return 0;
}