Submission #330825

#TimeUsernameProblemLanguageResultExecution timeMemory
330825ThaiBaHungCryptography (NOI20_crypto)C++14
100 / 100
572 ms34676 KiB
#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 3;
const int mod = 1e9 + 7;
int n;
int a[N];
vector < int > num;
map < int, int > id;
long long gt[N];

struct ok
{
    int lo;
    int hi;
    int val;
};
ok Node[4 * N];

void build(int id, int l, int r)
{
    Node[id].lo = l; Node[id].hi = r;
    Node[id].val = 1;

    if (l == r) return;

    int mid = (l + r) / 2;

    build(id * 2, l, mid);
    build(id * 2 + 1, mid + 1, r);

    Node[id].val = Node[id * 2].val + Node[id * 2 + 1].val;
}

void update(int id, int pos)
{
    if (Node[id].lo > pos || Node[id].hi < pos) return;

    if (Node[id].lo == Node[id].hi)
    {
        Node[id].val = 0;
        return;
    }

    update(id * 2, pos);
    update(id * 2 + 1, pos);

    Node[id].val = Node[id * 2].val + Node[id * 2 + 1].val;
}

int getval(int id, int pos)
{
    if (Node[id].lo >= pos) return 0;

    if (Node[id].hi < pos)
        return Node[id].val;

    return getval(id * 2, pos) + getval(id * 2 + 1, pos);
}

int main()
{
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    //freopen("t.inp","r",stdin); freopen("t.out","w",stdout);

    cin >> n;

    for (int i = 1; i <= n; i++)
        cin >> a[i], num.push_back(a[i]);

    sort(num.begin(), num.end());

    for (int i = 0; i < num.size(); i++)
        id[num[i]] = i + 1;

    for (int i = 1; i <= n; i++)
        a[i] = id[a[i]];

    gt[0] = 1;
    for (int i = 1; i <= n; i++)
        gt[i] = gt[i - 1] * 1ll * i, gt[i] %= mod;


    long long res = 0;

    build(1, 1, n);

    for (int i = 1; i <= n; i++)
    {
        int tmp = getval(1, a[i]);

        res += 1ll * tmp * gt[n - i] % mod;
        res %= mod;

        update(1, a[i]);
    }

    cout << (res + 1) % mod;
}

Compilation message (stderr)

Crypto.cpp: In function 'int main()':
Crypto.cpp:72:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |     for (int i = 0; i < num.size(); i++)
      |                     ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...