专栏文章

题解:AT_jsc2019_qual_b Kleene Inversion

AT_jsc2019_qual_b题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@miqpx7as
此快照首次捕获于
2025/12/04 08:49
3 个月前
此快照最后确认于
2025/12/04 08:49
3 个月前
查看原文

思路:

因为共有 kkAA 序列,所以逆序对分为两种:
  1. 在不同的 AA 序列中。
  2. 在相同的 AA 序列中。
11 种情况就是求出 1in1 \le i \le n1jn1 \le j \le nai>aja_i>a_j 组成的数对的个数乘上 k×(k1)2\frac{k\times(k-1)}{2},表示对于所有第 ll 个序列和第 rr 个序列组成的数对,保证 1lrk1 \le l \le r \le k
22 种情况就是在所有 kk 个序列中的逆序对,共有 AA 序列的逆序对个数乘上 kk

Code:

CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define il inline
int n,a[2005],k,s,ss;
const int mod=1e9+7;
signed main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(a[j]>a[i])s++,s%=mod;
		}
	}
	int kk=k*(k-1)/2;
	kk%=mod;
	s*=kk;
	s%=mod;
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			if(a[j]<a[i])ss++;
		}
	}
//	cout<<s<<" "<<kk<<" "<<ss<<" "<<k<<'\n';
	cout<<(s+ss*k%mod)%mod;
}
易如反掌

评论

1 条评论,欢迎与作者交流。

正在加载评论...