提出 #26190647


ソースコード 拡げる

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b) for(int i = (a); i <= (b); ++ i)
#define per(i, a, b) for(int i = (a); i >= (b); -- i)
#define rep0(i, a) for(int i = 0; i < (a); ++ i)

#define MP make_pair
#define fi first
#define se second

#define pb push_back
#define SIZ(x) (int)(x).size()
#define All(x) (x).begin(),(x).end()

#define Fill(a, b) memset(a, b, sizeof(a))

template <typename T1, typename T2> void CMax(T1 &x, T2 y) {if (y > x) x = y;}
template <typename T1, typename T2> void CMin(T1 &x, T2 y) {if (y < x) x = y;}
template <typename T> void read(T &x) {
	x = 0; int op = 1; char c = getchar();
	while (!isdigit(c)) {
		if (c == '-') op = -1;
		c = getchar();
	}
	while (isdigit(c)) {
		x = (x << 1) + (x << 3) + (c ^ 48);
		c = getchar();
	}
	x *= op;
}

typedef long long LL;
typedef unsigned int ui;
typedef unsigned long long ull;

typedef pair <int, int> pii;
typedef pair <long long, int> pli;
typedef pair <long long, long long> pll;

inline void swap(int &x, int &y) {x ^= y ^= x ^= y;}
inline int min(int x, int y) {return x < y ? x : y;}
inline int max(int x, int y) {return x > y ? x : y;}

const int Mod = 1000000007;
const int inv2 = 500000004;
int Pls(int x, int y) {x += y; return x >= Mod ? x - Mod : x;}
int Sub(int x, int y) {x -= y; return x < 0 ? x + Mod : x;}
int power(int x, int p) {
	int ret = 1;
	while (p) {
		if (p & 1) ret = 1ll * ret * x % Mod;
		x = 1ll * x * x % Mod; p >>= 1;
	} return ret;
}
int Inv(int x) {return power(x, Mod - 2);}

const int MN = 200000 + 10;
const int MS = MN << 2;

int N;
pii A[MN];

int sum[MS], mul[MS], cnt[MS];
#define mid ((l + r) >> 1)
#define ls (x << 1)
#define rs (x << 1 | 1)
void pushup(int x) {
	sum[x] = Pls(sum[ls], sum[rs]);
	cnt[x] = cnt[ls] + cnt[rs];
}
void pushmul(int x, int v) {
	if (!x) return;
	sum[x] = 1ll * sum[x] * v % Mod;
	mul[x] = 1ll * mul[x] * v % Mod;
}
void pushdown(int x) {
	if (mul[x] == 1) return;
	pushmul(ls, mul[x]); pushmul(rs, mul[x]);
	mul[x] = 1;
}
void Build(int x = 1, int l = 1, int r = N) {
	mul[x] = 1; if (l == r) return;
	Build(ls, l, mid); Build(rs, mid + 1, r);
}
void Mdf(int pos, int v, int x = 1, int l = 1, int r = N) {
	if (l == r) {sum[x] = v; cnt[x] = 1; return;}
	pushdown(x);
	if (pos <= mid) Mdf(pos, v, ls, l, mid);
	else Mdf(pos, v, rs, mid + 1, r);
	pushup(x);
}
void Mdf2(int v) {pushmul(1, v);}
int Qsum(int L, int R, int x = 1, int l = 1, int r = N) {
	if (L <= l && r <= R) return sum[x];
	pushdown(x); int ret = 0;
	if (L <= mid) ret = Pls(ret, Qsum(L, R, ls, l, mid));
	if (R > mid) ret = Pls(ret, Qsum(L, R, rs, mid + 1, r));
	return ret;
}
int Qcnt(int L, int R, int x = 1, int l = 1, int r = N) {
	if (L <= l && r <= R) return cnt[x];
	int ret = 0;
	if (L <= mid) ret += Qcnt(L, R, ls, l, mid);
	if (R > mid) ret += Qcnt(L, R, rs, mid + 1, r);
	return ret;
}
#undef mid
#undef ls
#undef rs

int ans, tot = 1;

int main() {
	read(N);
	rep(i, 1, N) read(A[i].fi), A[i].se = i;
	sort(A + 1, A + N + 1);
	Build();
	for (int i = 1; i <= N; ++ i) {
		int inv = Inv(A[i].fi - i + 1); tot = 1ll * tot * (A[i].fi - i + 1) % Mod;
		int v = (1ll * Qsum(1, A[i].se) * inv + 2ll * Qcnt(A[i].se, N) - 1ll * Qsum(A[i].se, N) * inv) % Mod;
		v = (v + Mod) % Mod; ans = Pls(ans, v);
		Mdf2(1ll * (A[i].fi - i) * inv % Mod); Mdf(A[i].se, A[i].fi - i);
	}
	ans = 1ll * ans * inv2 % Mod * tot % Mod;
	printf("%d", ans);
	return 0;
}

提出情報

提出日時
問題 E - Inversions
ユーザ XuXiaoYuan
言語 C++ (GCC 9.2.1)
得点 1700
コード長 3515 Byte
結果 AC
実行時間 241 ms
メモリ 11464 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 1700 / 1700
結果
AC × 4
AC × 43
セット名 テストケース
Sample sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt
All sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt, sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt, subtask_1_01.txt, subtask_1_02.txt, subtask_1_03.txt, subtask_1_04.txt, subtask_1_05.txt, subtask_1_06.txt, subtask_1_07.txt, subtask_1_08.txt, subtask_1_09.txt, subtask_1_10.txt, subtask_1_11.txt, subtask_1_12.txt, subtask_1_13.txt, subtask_1_14.txt, subtask_1_15.txt, subtask_1_16.txt, subtask_1_17.txt, subtask_1_18.txt, subtask_1_19.txt, subtask_1_20.txt, subtask_1_21.txt, subtask_1_22.txt, subtask_1_23.txt, subtask_1_24.txt, subtask_1_25.txt, subtask_1_26.txt, subtask_1_27.txt, subtask_1_28.txt, subtask_1_29.txt, subtask_1_30.txt, subtask_1_31.txt, subtask_1_32.txt, subtask_1_33.txt, subtask_1_34.txt, subtask_1_35.txt
ケース名 結果 実行時間 メモリ
sample_01.txt AC 8 ms 3580 KiB
sample_02.txt AC 2 ms 3704 KiB
sample_03.txt AC 2 ms 3764 KiB
sample_04.txt AC 2 ms 3660 KiB
subtask_1_01.txt AC 2 ms 3480 KiB
subtask_1_02.txt AC 2 ms 3600 KiB
subtask_1_03.txt AC 161 ms 10852 KiB
subtask_1_04.txt AC 20 ms 4196 KiB
subtask_1_05.txt AC 59 ms 5600 KiB
subtask_1_06.txt AC 131 ms 10968 KiB
subtask_1_07.txt AC 51 ms 5480 KiB
subtask_1_08.txt AC 88 ms 7352 KiB
subtask_1_09.txt AC 75 ms 7360 KiB
subtask_1_10.txt AC 30 ms 5344 KiB
subtask_1_11.txt AC 134 ms 7512 KiB
subtask_1_12.txt AC 137 ms 7668 KiB
subtask_1_13.txt AC 200 ms 11236 KiB
subtask_1_14.txt AC 239 ms 11368 KiB
subtask_1_15.txt AC 229 ms 11188 KiB
subtask_1_16.txt AC 238 ms 11372 KiB
subtask_1_17.txt AC 165 ms 11376 KiB
subtask_1_18.txt AC 167 ms 11364 KiB
subtask_1_19.txt AC 237 ms 11408 KiB
subtask_1_20.txt AC 163 ms 11296 KiB
subtask_1_21.txt AC 163 ms 11296 KiB
subtask_1_22.txt AC 238 ms 11296 KiB
subtask_1_23.txt AC 240 ms 11408 KiB
subtask_1_24.txt AC 240 ms 11364 KiB
subtask_1_25.txt AC 237 ms 11464 KiB
subtask_1_26.txt AC 225 ms 11464 KiB
subtask_1_27.txt AC 238 ms 11300 KiB
subtask_1_28.txt AC 162 ms 11396 KiB
subtask_1_29.txt AC 167 ms 11308 KiB
subtask_1_30.txt AC 241 ms 11252 KiB
subtask_1_31.txt AC 161 ms 11236 KiB
subtask_1_32.txt AC 162 ms 11376 KiB
subtask_1_33.txt AC 240 ms 11408 KiB
subtask_1_34.txt AC 238 ms 11324 KiB
subtask_1_35.txt AC 240 ms 11364 KiB