답안 #881734

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
881734 2023-12-01T19:52:30 Z Mher777 Simple game (IZhO17_game) C++17
100 / 100
128 ms 48980 KB
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
#include <array>
#include <string>
#include <algorithm>
#include <cmath>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <bitset>
#include <list>
#include <iterator>
#include <numeric>
#include <complex>
#include <utility>
#include <random>
#include <fstream>
using namespace std;

/* -------------------- Typedefs -------------------- */

typedef int itn;
typedef long long ll;
typedef unsigned long long ull;
typedef float fl;
typedef double db;
typedef long double ld;

/* -------------------- Usings -------------------- */

using vi = vector<int>;
using vll = vector<ll>;
using mii = map<int, int>;
using mll = map<ll, ll>;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

/* -------------------- Defines -------------------- */

#define kap map
#define ff first
#define ss second
#define pub push_back
#define pob pop_back
#define puf push_front
#define pof pop_front
#define mpr make_pair
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
#define all(x) (x).begin(), (x).end()

/* -------------------- Constants -------------------- */

const int MAX = int(1e9 + 5);
const ll MAXL = ll(1e18 + 5);
const ll MOD = ll(1e9 + 7);
const ll MOD2 = ll(998244353);
const ll CON = (ll)(911382323);
const ll MOD3 = (ll)(972663749);

/* -------------------- Functions -------------------- */

void fastio() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
}

void precision(int x) {
    cout.setf(ios::fixed | ios::showpoint);
    cout.precision(x);
}

ll gcd(ll a, ll b) {
    while (b) {
        a %= b;
        swap(a, b);
    }
    return a;
}

ll lcm(ll a, ll b) {
    return a / gcd(a, b) * b;
}

ll range_sum(ll a, ll b) {
    ll dif = a - 1, cnt = b - a + 1;
    ll ans = ((b - a + 1) * (b - a + 2)) / 2;
    ans += ((b - a + 1) * dif);
    return ans;
}

string dec_to_bin(ll a) {
    string s = "";
    for (ll i = a; i > 0; ) {
        ll k = i % 2;
        i /= 2;
        char c = k + 48;
        s += c;
    }
    if (a == 0) {
        s = "0";
    }
    reverse(all(s));
    return s;
}

ll bin_to_dec(string s) {
    ll num = 0;
    for (int i = 0; i < s.size(); i++) {
        num *= 2ll;
        num += (s[i] - '0');
    }
    return num;
}

int isPrime(ll a) {
    if (a == 1) return 0;
    for (ll i = 2; i * i <= a; i++) {
        if (a % i == 0) return 0;
    }
    return 1;
}

ll binpow(ll a, ll b) {
    if (!a) return 0;
    ll ans = 1;
    while (b) {
        if (b & 1) {
            ans *= a;
        }
        b >>= 1;
        a *= a;
    }
    return ans;
}

ll binpow_by_mod(ll a, ll b, ll mod) {
    if (!a) return 0;
    ll ans = 1;
    while (b) {
        if (b & 1) {
            ans *= a;
            ans %= mod;
        }
        b >>= 1;
        a *= a;
        a %= mod;
    }
    return ans;
}

/* -------------------- Solution -------------------- */

const int N = 1000005;
int m = 1000000;
int a[N], t[N * 4], ans[N], p[N];
vi g[N];

void bld(int l = 1, int r = m, int pos = 1) {
    if (l == r) {
        p[l] = pos;
    }
    else {
        int mid = (l + r) / 2;
        bld(l, mid, 2 * pos);
        bld(mid + 1, r, 2 * pos + 1);
    }
}

void upd(int l, int r, int val, int tl = 1, int tr = m, int pos = 1) {
    if (l == tl && r == tr) {
        t[pos] += val;
        return;
    }
    int mid = (tl + tr) / 2;
    if (mid >= r) {
        upd(l, r, val, tl, mid, 2 * pos);
        return;
    }
    if (mid < l) {
        upd(l, r, val, mid + 1, tr, 2 * pos + 1);
        return;
    }
    upd(l, mid, val, tl, mid, 2 * pos);
    upd(mid + 1, r, val, mid + 1, tr, 2 * pos + 1);
}

int get(int pos) {
    int val = ans[pos];
    pos = p[pos];
    while (pos) {
        val += t[pos];
        pos /= 2;
    }
    return val;
}

void slv() {
    int n, q;
    cin >> n >> q;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
        g[a[i]].pub(i);
    }
    int cur = 0;
    for (int i = 1; i <= m; ++i) {
        for (auto elem : g[i]) {
            if (elem > 1 && a[elem - 1] < i - 1) --cur;
            if (elem < n && a[elem + 1] < i - 1) --cur;
        }
        for (auto elem : g[i - 1]) {
            if (elem > 1 && a[elem - 1] > i) ++cur;
            if (elem < n && a[elem + 1] > i) ++cur;
        }
        ans[i] = cur;
    }
    bld();
    while (q--) {
        int type, ind;
        cin >> type >> ind;
        if (type == 2) {
            cout << get(ind) << '\n';
            continue;
        }
        int val;
        cin >> val;
        if (ind > 1 && (max(a[ind], a[ind - 1]) - 1) >= (min(a[ind], a[ind - 1]) + 1)) {
            upd(min(a[ind], a[ind - 1]) + 1, max(a[ind], a[ind - 1]) - 1, -1);
        }
        if (ind < n && (max(a[ind], a[ind + 1]) - 1) >= (min(a[ind], a[ind + 1]) + 1)) {
            upd(min(a[ind], a[ind + 1]) + 1, max(a[ind], a[ind + 1]) - 1, -1);
        }
        a[ind] = val;
        if (ind > 1 && (max(a[ind], a[ind - 1]) - 1) >= (min(a[ind], a[ind - 1]) + 1)) {
            upd(min(a[ind], a[ind - 1]) + 1, max(a[ind], a[ind - 1]) - 1, 1);
        }
        if (ind < n && (max(a[ind], a[ind + 1]) - 1) >= (min(a[ind], a[ind + 1]) + 1)) {
            upd(min(a[ind], a[ind + 1]) + 1, max(a[ind], a[ind + 1]) - 1, 1);
        }
    }
}

void cs() {
    int tstc = 1;
    //cin >> tstc;
    while (tstc--) {
        slv();
    }
}

void precalc() {
    return;
}

int main() {
    fastio();
    precalc();
    //precision(0);
    cs();
    return 0;
}

Compilation message

game.cpp: In function 'll range_sum(ll, ll)':
game.cpp:93:21: warning: unused variable 'cnt' [-Wunused-variable]
   93 |     ll dif = a - 1, cnt = b - a + 1;
      |                     ^~~
game.cpp: In function 'll bin_to_dec(std::string)':
game.cpp:116:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  116 |     for (int i = 0; i < s.size(); i++) {
      |                     ~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 35512 KB Output is correct
2 Correct 14 ms 40540 KB Output is correct
3 Correct 13 ms 40540 KB Output is correct
4 Correct 14 ms 40692 KB Output is correct
5 Correct 13 ms 42588 KB Output is correct
6 Correct 14 ms 41820 KB Output is correct
7 Correct 11 ms 35420 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 35512 KB Output is correct
2 Correct 14 ms 40540 KB Output is correct
3 Correct 13 ms 40540 KB Output is correct
4 Correct 14 ms 40692 KB Output is correct
5 Correct 13 ms 42588 KB Output is correct
6 Correct 14 ms 41820 KB Output is correct
7 Correct 11 ms 35420 KB Output is correct
8 Correct 33 ms 37052 KB Output is correct
9 Correct 63 ms 40536 KB Output is correct
10 Correct 66 ms 40648 KB Output is correct
11 Correct 31 ms 36844 KB Output is correct
12 Correct 43 ms 38484 KB Output is correct
13 Correct 41 ms 38204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 35512 KB Output is correct
2 Correct 14 ms 40540 KB Output is correct
3 Correct 13 ms 40540 KB Output is correct
4 Correct 14 ms 40692 KB Output is correct
5 Correct 13 ms 42588 KB Output is correct
6 Correct 14 ms 41820 KB Output is correct
7 Correct 11 ms 35420 KB Output is correct
8 Correct 33 ms 37052 KB Output is correct
9 Correct 63 ms 40536 KB Output is correct
10 Correct 66 ms 40648 KB Output is correct
11 Correct 31 ms 36844 KB Output is correct
12 Correct 43 ms 38484 KB Output is correct
13 Correct 41 ms 38204 KB Output is correct
14 Correct 128 ms 48980 KB Output is correct
15 Correct 115 ms 48724 KB Output is correct
16 Correct 117 ms 48880 KB Output is correct
17 Correct 116 ms 47016 KB Output is correct
18 Correct 122 ms 48980 KB Output is correct