제출 #1358597

#제출 시각아이디문제언어결과실행 시간메모리
1358597retardeMizuyokan 2 (JOI23_mizuyokan2)C++20
0 / 100
1471 ms1114112 KiB
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define pf push_front
#define mp make_pair
#define fi first
#define se second
#define int long long
#define all(x) (x).begin(), (x).end()

typedef long double ld;
typedef long long ll;
typedef pair<ll,ll> pll;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<bool> vb;
typedef vector<vector<int>> vvi;
typedef vector<vector<bool>> vvb;
typedef vector<vector<ll>> vvll;
typedef vector<string> vs;
typedef vector<vector<string>> vvs;
typedef vector<char> vc;
typedef vector<vector<char>> vvc;
typedef map<int, int> mii;
typedef unordered_map<int, int> umii;

const int mod = 1e9 + 7;
const int inf = INTMAX_MAX;
const bool tc = false;

int LB = -1e16, RB = 1e16;

struct SparseSegTree {
    struct Node {
        int val;
        Node *l, *r;

        Node() {
            val = (int)-1e18;
            l = r = nullptr;
        }
    };

    Node* root;
    int L, R;

    SparseSegTree(int _L = LB, int _R = RB) {
        L = _L;
        R = _R;
        root = nullptr;
    }

    int get(Node* node) {
        return node ? node->val : (int)-1e18;
    }

    void upd(Node*& node, int tl, int tr, int pos, int x) {
        if (!node) node = new Node();

        if (tl == tr) {
            node->val = max(node->val, x);
            return;
        }

        int tm = tl + (tr - tl) / 2;

        if (pos <= tm) upd(node->l, tl, tm, pos, x);
        else upd(node->r, tm + 1, tr, pos, x);

        node->val = max(get(node->l), get(node->r));
    }

    int query(Node* node, int tl, int tr, int l, int r) {
        if (!node || r < tl || tr < l) return (int)-1e18;
        if (l <= tl && tr <= r) return node->val;

        int tm = tl + (tr - tl) / 2;

        return max(
            query(node->l, tl, tm, l, r),
            query(node->r, tm + 1, tr, l, r)
        );
    }

    void upd(int pos, int x) {
        upd(root, L, R, pos, x);
    }

    int query(int l, int r) {
        if (l > r) return (int)-1e18;
        return query(root, L, R, l, r);
    }
};

int N;
const int mxn = 250001;
int a[mxn];

// dont use a
int query(vi &v) {
    int n = (int)v.size() - 1;
    vi p(n + 1); for (int i = 1; i <= n; i++) p[i] = p[i - 1] + v[i];
    SparseSegTree inc(LB, RB), dec(LB, RB); // dp[j] value will be added to p[j - 1] - v[j]
    // inc.upd(p[n - 1] - v[n], 1); dec.upd(p[n - 1] - v[n], 1);
    for (int i = n; i >= 1; i--) {
        int decans = max(inc.query(p[i - 1] + 1, RB - 1), (int)0) + 1;
        int incans = max(dec.query(LB + 1, p[i - 1] - 1), (int)0) + 1;
        dec.upd(p[i - 1] - v[i], decans);
        inc.upd(p[i - 1] - v[i], incans);
    }
    return max(inc.query(p[0] - v[1], p[0] - v[1]), dec.query(p[0] - v[1], p[0] - v[1]));
}

inline void solve() {
    cin >> N; for (int i = 0; i < N; i++) cin >> a[i];
    int q; cin >> q;
    while (q--) {
        int x, y, l, r;
        cin >> x >> y >> l >> r;
        x--; a[x] = y; r--;
        vi v; v.pb(0); for (int i = l; i <= r; i++) v.pb(a[i]);
        cout << query(v) << '\n';
    }
}

void setIO(string s) {
    freopen((s + ".in").c_str(), "r", stdin);
    freopen((s + ".out").c_str(), "w", stdout);
}

signed main() {
    ios::sync_with_stdio(false);
    cout.tie(0);
    cin.tie(0);
    //setIO();

    int t = 1;
    if (tc) {
        cin >> t;
    }

    while (t--) {
        solve();
    }
}

컴파일 시 표준 에러 (stderr) 메시지

mizuyokan2.cpp: In function 'void setIO(std::string)':
mizuyokan2.cpp:129:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  129 |     freopen((s + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mizuyokan2.cpp:130:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  130 |     freopen((s + ".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…