Submission #54692

# Submission time Handle Problem Language Result Execution time Memory
54692 2018-07-04T16:00:52 Z SpaimaCarpatilor Fish (IOI08_fish) C++17
95 / 100
844 ms 18816 KB
#include<bits/stdc++.h>

using namespace std;

const int maxN = 500000;
int N, K, mod, l[maxN + 9], t[maxN + 9], f[maxN + 9], lastCovered[maxN + 9];

void read ()
{
    scanf ("%d %d %d", &N, &K, &mod);
    vector < pair < int, int > > v;
    v.resize (N);
    for (int i=0; i<N; i++)
        scanf ("%d %d", &v[i].first, &v[i].second);
    sort (v.begin (), v.end ());
    for (int i=1; i<=N; i++)
        l[i] = v[i - 1].first, t[i] = v[i - 1].second;
}

namespace segtree {
    short aint[1100009];
    void build (int nod, int st, int dr)
    {
        aint[nod] = 1;
        if (st == dr) return ;
        int mij = (st + dr) >> 1, f1 = nod << 1, f2 = f1 | 1;
        build (f1, st, mij);
        build (f2, mij + 1, dr);
    }

    void change (int nod, int st, int dr, int pos, int val)
    {
        if (st == dr)
        {
            aint[nod] = val % mod;
            return ;
        }
        int mij = (st + dr) >> 1, f1 = nod << 1, f2 = f1 | 1;
        if (pos <= mij) change (f1, st, mij, pos, val);
        else change (f2, mij + 1, dr, pos, val);
        aint[nod] = ((int) aint[f1] * aint[f2]) % mod;
    }

    int ansQ;
    void query (int nod, int st, int dr, int x, int y)
    {
        if (x <= st && dr <= y)
        {
            ansQ = (ansQ * aint[nod]) % mod;
            return ;
        }
        int mij = (st + dr) >> 1, f1 = nod << 1, f2 = f1 | 1;
        if (x <= mij) query (f1, st, mij, x, y);
        if (mij < y) query (f2, mij + 1, dr, x, y);
    }

    int prod (int st, int dr)
    {
        ansQ = 1, dr = min (dr, N), st = max (st, 1);
        if (st <= dr) query (1, 1, N, st, dr);
        return ansQ;
    }
}

int minJ[maxN + 9], lst[maxN + 9], frst[maxN + 9], nxt[maxN + 9];
void buildMinJ ()
{
    int j = 0;
    for (int i=1; i<=N; i++)
    {
        while (j <= N && l[j] < 2 * l[i]) j ++;
        minJ[i] = j;
    }
}

void buildNxtLstFrst ()
{
    for (int i=1; i<=N; i++)
    {
        if (lst[t[i]] != 0)
            nxt[lst[t[i]]] = i;
        lst[t[i]] = i;
    }
    for (int i=N; i>=1; i--)
        frst[t[i]] = i;
}

int ans = 0;
void computeAnswer ()
{
    int i = 0;
    for (int j=1; j<=N; j++)
    {
        while (l[i + 1] * 2 <= l[j])
            i ++, f[t[i]] ++, lastCovered[t[i]] = i,
            segtree::change (1, 1, N, lst[t[i]], f[t[i]] + 1);
        if (lst[t[j]] == j)
        {
            ///I take the max frequency for t[i]
            int k = minJ[nxt[lastCovered[t[j]]]];
            if (k == 0) k = minJ[frst[t[j]]];
            ans = (ans + segtree::prod (1, j - 1) * segtree::prod (j + 1, k - 1)) % mod;
            ///I take any number of t[i], but the max frequency
            ans = (ans + f[t[j]] * segtree::prod (1, j - 1)) % mod;
        }
    }
}

int main ()
{
//freopen ("input", "r", stdin);
//freopen ("output", "w", stdout);

read (), segtree::build (1, 1, N);
buildNxtLstFrst ();
buildMinJ ();
computeAnswer ();
printf ("%d\n", ans);

return 0;
}

Compilation message

fish.cpp: In function 'void read()':
fish.cpp:10:11: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf ("%d %d %d", &N, &K, &mod);
     ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
fish.cpp:14:15: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf ("%d %d", &v[i].first, &v[i].second);
         ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 492 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 492 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 492 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 652 KB Output is correct
2 Correct 2 ms 652 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 652 KB Output is correct
2 Correct 322 ms 10624 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 10624 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 10624 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 139 ms 10624 KB Output is correct
2 Correct 163 ms 10624 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 10624 KB Output is correct
2 Correct 7 ms 10624 KB Output is correct
3 Correct 6 ms 10624 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 242 ms 10624 KB Output is correct
2 Correct 352 ms 10624 KB Output is correct
3 Correct 316 ms 10624 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 329 ms 10624 KB Output is correct
2 Correct 348 ms 12612 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 166 ms 12612 KB Output is correct
2 Correct 325 ms 12656 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 301 ms 12656 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 372 ms 12928 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 255 ms 12928 KB Output is correct
2 Correct 299 ms 13488 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 664 ms 14336 KB Output is correct
2 Correct 405 ms 14336 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 450 ms 14336 KB Output is correct
2 Correct 482 ms 14336 KB Output is correct
3 Incorrect 607 ms 15488 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 701 ms 15552 KB Output is correct
2 Correct 761 ms 18304 KB Output is correct
3 Correct 654 ms 18304 KB Output is correct
4 Correct 844 ms 18816 KB Output is correct