记录编号 423555 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [郑州集训 2017]NOI模拟题5.1 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 7.619 s
提交时间 2017-07-12 08:46:15 内存使用 38.46 MiB
显示代码纯文本
#include <cstdio>
#include <iostream>
#include <algorithm>
// DATA_GEN --- BEGIN ---// 你可以直接将这个数据生成器嵌入到你的代码中
// 或者,你也可以根据自己程序的需要,自己改写这个数据生成器
// 使用方法:从输入文件读入 N 和随机数种子之后,调用 gen_data 方法,可以将获得的排列 {A}, {B}, {C} 分别存放在对应 3 个数组中
const int MAXN = 2e6 + 10;
int lastInt, seed;
inline int nextInt() {
	static const int mod = 1e9 + 7;
	lastInt = lastInt ^ (((long long) lastInt * lastInt + seed) % mod);
	return lastInt;
}
void getPerm(int P[], int n, int x0, int c) {
	for (int i = 1; i <= n; ++i) P[i] = i;
	lastInt = x0;
	seed = c;
	for (int i = n; i >= 1; --i) std::swap(P[i], P[nextInt() % i + 1]);
}
int n, A[MAXN], B[MAXN], C[MAXN];  // 生成的排列将存储在这三个数组中
void gen_data(int n, int a0, int seed_a, int b0, int seed_b, int c0, int seed_c) {
	getPerm(A, n, a0, seed_a);
	getPerm(B, n, b0, seed_b);
	getPerm(C, n, c0, seed_c);
}
// DATA_GEN --- END ---
typedef long long ll;
ll ans;
struct bit{
	int a[MAXN];
	void add(int p,int d){
		for (;p<=n;p+=p&-p) a[p]+=d;
	}
	int sum(int p){
		int ans=0;
		for (;p;p-=p&-p) ans+=a[p];
		return ans;
	}
}T;
int q[MAXN];
ll calc(int *A,int *B){
	ll ans=0;
	for (int i=1;i<=n;i++) q[A[i]]=i;
	for (int i=1;i<=n;i++) T.a[i]=0;
	//for (int i=1;i<=n;i++) printf("(%d,%d)\n",A[q[i]],B[q[i]]);
	for (int i=1;i<=n;i++) ans+=T.sum(B[q[i]]),T.add(B[q[i]],1);
	//printf("ans=%lld\n",ans);
	return ans;
}
int main()
{
	freopen("order1.in", "r", stdin);
	freopen("order1.out", "w", stdout);
	int a0, s_a;
	int b0, s_b;
	int c0, s_c;
	std::cin >> n;
	std::cin >> a0 >> s_a;
	std::cin >> b0 >> s_b;
	std::cin >> c0 >> s_c;
	gen_data(n, a0, s_a, b0, s_b, c0, s_c);
	ans=-1ll*n*(n-1)/2;
	ans+=calc(A,B);
	ans+=calc(B,C);
	ans+=calc(A,C);
	printf("%lld\n",ans/2);
	fclose(stdin);
	fclose(stdout);
	return 0;
}