結果
| 問題 |
No.1300 Sum of Inversions
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-11-27 21:55:20 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,763 bytes |
| コンパイル時間 | 2,508 ms |
| コンパイル使用メモリ | 206,532 KB |
| 最終ジャッジ日時 | 2025-01-16 07:06:16 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 33 WA * 1 |
ソースコード
// UTF−8
#include<bits/stdc++.h>
/* #include<atcoder/all> */
/* using namespace atcoder; */
using namespace std;
using ll = long long int;
using lc = complex<ll>;
template<class T>bool chmax(T &a, const T &b) { return (a<b ? (a=b,1) : 0); }
template<class T>bool chmin(T &a, const T &b) { return (a>b ? (a=b,1) : 0); }
template <typename T>
struct SegmentTree {
using F = function<T(T, T)>;
const T e;
const F f;
size_t sz;
vector<T> tree;
SegmentTree(size_t n, const F &f, const T &e = 0) : f(f), e(e) {
sz = 1;
while(sz < n) sz <<= 1;
tree.assign(2*sz, e);
}
void set(typename vector<T>::iterator begin, typename vector<T>::iterator end) {
copy(begin, end, tree.begin() + sz);
for(size_t k=sz-1; k>0; k--)
tree[k] = f(tree[2*k+0], tree[2*k+1]);
}
void update(size_t k, const T &x) {
k += sz;
tree[k] = x;
while(k >>= 1)
tree[k] = f(tree[2*k+0], tree[2*k+1]);
}
T query(size_t a, size_t b) const {
b = min(b, sz);
a = max((size_t)0, a);
T l = e, r = e;
for(a += sz, b += sz; a < b; a >>= 1, b >>= 1) {
if(a & 1) l = f(l, tree[a++]);
if(b & 1) r = f(tree[--b], r);
}
return f(l, r);
}
T operator[](const size_t k) const {
return tree[sz + k];
}
};
int main(void) {
constexpr ll MOD = 0 ? 1e9+7 : 998244353;
constexpr double PI = acos(-1);
constexpr double eps = 1e-10;
cout << fixed << setprecision(32);
cin.tie(0); ios::sync_with_stdio(false);
if(1) {
ll n;
cin >> n;
vector<ll> a(n);
for(auto &e: a) cin >> e;
vector<ll> b = a;
sort(begin(b), end(b));
SegmentTree<pair<ll,ll>> st1(n, [&](auto a, auto b) -> pair<ll,ll>{
auto [x, m] = a;
auto [y, n] = b;
return {(x+y)%MOD, m+n};
}, {0ll, 0ll});
SegmentTree<pair<ll,ll>> st2(n, [&](auto a, auto b) -> pair<ll,ll>{
auto [x, m] = a;
auto [y, n] = b;
return {(x+y)%MOD, m+n};
}, {0ll, 0ll});
ll r = 0;
for(ll i=0; i<n; i++) {
ll j = lower_bound(begin(b), end(b), a[i]) - begin(b);
auto [x, y] = st1.query(j+1, n);
auto [z, w] = st2.query(j+1, n);
(r += (z + w*a[i]) % MOD) %= MOD;
st2.update(j, {(get<0>(st2[j]) + x+a[i]*y)%MOD, get<1>(st2[j]) + y});
st1.update(j, {(get<0>(st1[j]) + a[i])%MOD, get<1>(st1[j]) + 1});
// cout << x << ' ' << y << ' ' << z << ' ' << w << ' ' << r << endl;
}
cout << r << endl;
}
return 0;
}