제출 #1333689

#제출 시각아이디문제언어결과실행 시간메모리
1333689nguyengiabach1201Election (BOI18_election)C++20
100 / 100
373 ms66512 KiB
// https://oj.uz/problem/view/BOI18_election

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>

using namespace std;
using namespace __gnu_pbds;

#define el '\n'
#define FNAME ""
#define ll long long
#define int long long
#define ld long double

const int MOD = 1e9 + 7;
const ll INF = 1e18 + 7;
const double EPS = 1e-9;

void setup()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    if (fopen(FNAME ".inp", "r"))
    {
        freopen(FNAME ".inp", "r", stdin);
        freopen(FNAME ".out", "w", stdout);
    }

    return;
}

int n, q;
string s;

struct Node
{
    int pref, suff, sum, ans;
};

struct SegmentTree
{
    int n;
    vector<Node> nodes;

    Node merge(Node a, Node b)
    {
        Node res;

        res.pref = max({a.pref, a.sum + b.pref});
        res.suff = max({b.suff, b.sum + a.suff});
        res.sum = a.sum + b.sum;
        res.ans = max({a.ans + b.sum, a.sum + b.ans, a.pref + b.suff});

        return res;
    }

    void init(int n) { this->n = n, nodes.assign(4 * n + 5, {}); }

    void build() { build(1, 1, n); }

    void build(int idx, int l, int r)
    {
        if (l == r)
        {
            if (s[l] == 'C')
                nodes[idx] = {0, 0, -1, 0};
            else
                nodes[idx] = {1, 1, 1, 1};

            return;
        }

        int m = (l + r) >> 1;
        build(idx << 1, l, m);
        build((idx << 1) + 1, m + 1, r);
        nodes[idx] = merge(nodes[idx << 1], nodes[(idx << 1) + 1]);
    }

    Node query(int u, int v) { return query(u, v, 1, 1, n); }

    Node query(int u, int v, int idx, int l, int r)
    {
        if (r < u || v < l)
            return {0, 0, 0, 0};

        if (u <= l && r <= v)
            return nodes[idx];

        int mid = (l + r) >> 1;
        return merge(query(u, v, idx << 1, l, mid),
                     query(u, v, (idx << 1) + 1, mid + 1, r));
    }
};

SegmentTree st;

void solve()
{
    cin >> n >> s >> q, s = " " + s;

    st.init(n), st.build();

    for (int l, r, i = 1; i <= q; ++i)
        cin >> l >> r, cout << st.query(l, r).ans << el;

    return;
}

signed main()
{
    setup();

    int t = 1;
    bool multiTest = false;

    if (multiTest)
        cin >> t;

    while (t--)
        solve();

    return 0;
}

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

election.cpp: In function 'void setup()':
election.cpp:26:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   26 |         freopen(FNAME ".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
election.cpp:27:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   27 |         freopen(FNAME ".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...