专栏文章
AT_agc030_d [AGC030D] Inversion Sum题解
AT_agc030_d题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minm2h0i
- 此快照首次捕获于
- 2025/12/02 04:38 3 个月前
- 此快照最后确认于
- 2025/12/02 04:38 3 个月前
思路
转为期望,用 dp 求概率。
具体思路。
code
CPP#include<bits/stdc++.h>
using namespace std;
namespace LYY_XPLOR {
#define int long long
#define F(i, a, b) for(int i = a; i <= b; i ++ )
#define dF(i, a, b) for(int i = a; i >= b; i -- )
#define eF(i, a) for(int i = h[a]; ~i; i = ne[i])
#define ll long long
#define ull unsigned long long
#define db double
#define ldb long double
#define pii pair<int, int>
#define pb push_back
#define MP make_pair
#define N 3010
#define inv 500000004
#define mod 1000000007
int qmi(int a, int b) {int res = 1;while(b) {if(b & 1) res = res * a % mod;b >>= 1;a = a * a % mod;}return res;}
int n, q;
int a[N], f[N][N];
int X[N], Y[N];
signed main() {
scanf("%lld%lld", &n, &q);
F(i, 1, n) scanf("%d", a + i);
F(i, 1, n) F(j, 1, n) f[i][j] = (a[i] < a[j]);
F(i, 1, q) {
int u, v;
scanf("%d%d", &u, &v);
F(i, 1, n) if(i != u && i != v) f[u][i] = f[v][i] = (f[u][i] + f[v][i]) % mod * inv % mod;
F(i, 1, n) if(i != u && i != v) f[i][u] = f[i][v] = (f[i][v] + f[i][u]) % mod * inv % mod;
f[u][v] = f[v][u] = (f[u][v] + f[v][u]) % mod * inv % mod;
}
int ans = 0;
F(i, 1, n) F(j, 1, i - 1) ans = (ans + f[i][j]) % mod;
ans = ans * qmi(2, q) % mod;
printf("%lld\n", ans);
return 0;
}
}
signed main() {
LYY_XPLOR::main();
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...