专栏文章

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 条评论,欢迎与作者交流。

正在加载评论...