답안 #94275

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
94275 2019-01-17T09:30:22 Z Kastanda Simple game (IZhO17_game) C++11
0 / 100
63 ms 46812 KB
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#define pb push_back
using namespace __gnu_pbds;
using namespace std;
template < typename T >
using ordered_set = tree < T, null_type, less < T >, rb_tree_tag, tree_order_statistics_node_update >;
const int N = 100005, MXN = 1000006;
int n, q, A[N], cnt[2][MXN], st[MXN];
int qa[N], qb[N];
vector < int > U;
struct Fen
{
    int ts = 0;
    ordered_set < pair < int , int > > S[N + N];
    inline void Add(int i, int val)
    {
        for (i ++; i < N + N; i += i & -i)
            S[i].insert({val, ts ++});
    }
    inline void Del(int i, int val)
    {
        for (i ++; i < N + N; i += i & -i)
            S[i].erase(S[i].lower_bound({val, -1}));
    }
    inline int Get(int i, int val)
    {
        int ret = 0;
        for (i ++; i; i -= i & -i)
            ret += (int)S[i].size() - S[i].order_of_key({val, ts});
        return (ret);
    }
};
Fen F[2];
inline void Add(int w, int a, int b)
{
    F[w].Add(st[a] + cnt[w][a], b);
    cnt[w][a] ++;
}
inline void Del(int w, int a, int b)
{
    cnt[w][a] --;
    F[w].Del(st[a] + cnt[w][a], b);
}
int main()
{
    scanf("%d%d", &n, &q);
    for (int i = 1; i <= n; i++)
        scanf("%d", &A[i]), U.pb(A[i]);

    for (int i = 1; i <= q; i++)
    {
        int tp;
        scanf("%d%d", &tp, &qa[i]);
        if (tp == 1)
            scanf("%d", &qb[i]), U.pb(qb[i]);
    }
    int r = 1; U.pb(-1);
    sort(U.begin(), U.end());
    for (int i = 1; i < MXN; i++)
    {
        st[i] = r;
        while (r < (int)U.size() && U[r] == i)
            r ++;
    }
    for (int i = 1; i <= n; i++)
    {
        if (i < n && A[i] < A[i + 1])
            Add(0, A[i], A[i + 1]);
        if (i > 1 && A[i] < A[i - 1])
            Add(1, A[i], A[i - 1]);
    }
    for (int i = 1; i <= q; i++)
    {
        if (qb[i] == 0)
        {
            int lb = lower_bound(U.begin(), U.end(), qa[i]) - U.begin() - 1;
            printf("%d\n", F[0].Get(lb, qa[i]) + F[1].Get(lb, qa[i]));
            continue;
        }
        int id = qa[i], val = qb[i];

        if (id < n)
        {
            if (A[id] < A[id + 1])
                Del(0, A[id], A[id + 1]);
            if (A[id + 1] < A[id])
                Del(1, A[id + 1], A[id]);
        }
        if (id > 1)
        {
            if (A[id] < A[id - 1])
                Del(1, A[id], A[id - 1]);
            if (A[id - 1] < A[id])
                Del(0, A[id - 1], A[id]);
        }

        A[id] = val;

        if (id < n)
        {
            if (A[id] < A[id + 1])
                Add(0, A[id], A[id + 1]);
            if (A[id + 1] < A[id])
                Add(1, A[id + 1], A[id]);
        }
        if (id > 1)
        {
            if (A[id] < A[id - 1])
                Add(1, A[id], A[id - 1]);
            if (A[id - 1] < A[id])
                Add(0, A[id - 1], A[id]);
        }
    }
    return 0;
}

Compilation message

game.cpp: In function 'int main()':
game.cpp:48:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d", &n, &q);
     ~~~~~^~~~~~~~~~~~~~~~
game.cpp:50:27: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", &A[i]), U.pb(A[i]);
         ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
game.cpp:55:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &tp, &qa[i]);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~
game.cpp:57:32: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d", &qb[i]), U.pb(qb[i]);
             ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 49 ms 41856 KB Output is correct
2 Correct 63 ms 46812 KB Output is correct
3 Incorrect 63 ms 46588 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 49 ms 41856 KB Output is correct
2 Correct 63 ms 46812 KB Output is correct
3 Incorrect 63 ms 46588 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 49 ms 41856 KB Output is correct
2 Correct 63 ms 46812 KB Output is correct
3 Incorrect 63 ms 46588 KB Output isn't correct
4 Halted 0 ms 0 KB -