Submission #1253329

#TimeUsernameProblemLanguageResultExecution timeMemory
1253329quangminh412Fortune Telling 2 (JOI14_fortune_telling2)C++17
100 / 100
180 ms11592 KiB
/*
  Ben Watson
  Handle codeforces : quangminh98

  Current Theme: Transformers !!!!
*/

#include <bits/stdc++.h>
using namespace std;

#define ll long long

const string name = "test";

void solve();
signed main()
{
    if (fopen((name + ".inp").c_str(), "r"))
    {
        freopen((name + ".inp").c_str(), "r", stdin);
        freopen((name + ".out").c_str(), "w", stdout);
    }
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    solve();

    return 0;
}

// main program
const int maxn = 2e5 + 1;

struct SegmentTree
{
    vector<int> st;
    int n;

    SegmentTree(int n) : n(n) { st.resize(4 * n + 1, 0); }

    void update(int head, int l, int r, int pos, int val)
    {
        if (pos < l || r < pos) return;
        if (l == r)
        {
            st[head] = val;
            return;
        }

        int mid = l + r >> 1;
        if (pos <= mid)
            update(head << 1, l, mid, pos, val);
        else
            update(head << 1 | 1, mid + 1, r, pos, val);
        st[head] = max(st[head << 1], st[head << 1 | 1]);
    }
    void update(int pos, int val) { update(1, 1, n, pos, val); }

    int query(int head, int l, int r, int u, int v)
    {
        if (l > v || r < u) return 0;
        if (u <= l && r <= v) return st[head];

        int mid = l + r >> 1;
        return max(query(head << 1, l, mid, u, v), query(head << 1 | 1, mid + 1, r, u, v));
    }
    int query(int u, int v) { return query(1, 1, n, u, v); }
};

struct FenwickTree
{
    vector<int> bits;
    int n;

    FenwickTree(int n) : n(n) { bits.resize(n + 1, 0); }

    void update(int pos, int val)
    {
        for (; pos <= n; pos += (pos & (-pos)))
            bits[pos] += val;
    }

    int query(int pos)
    {
        int res = 0;
        for (; pos > 0; pos -= (pos & (-pos)))
            res += bits[pos];
        return res;
    }
    int query(int l, int r) { return query(r) - query(l - 1); }
};

int n, k;
int a[maxn], b[maxn], T[maxn];
vector<pair<int, int>> cards, ops;

// compression
int cur;
int id[maxn];
vector<int> v;

void solve()
{
    cin >> n >> k;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i] >> b[i];
        cards.push_back({max(a[i], b[i]), i});
    }
    for (int i = 1; i <= k; i++)
    {
        cin >> T[i];
        ops.push_back({T[i], i});
    }

    sort(cards.begin(), cards.end(), greater<pair<int, int>>());
    sort(ops.begin(), ops.end());

    // compression
    cur = 0;
    v.push_back(0);
    for (pair<int, int> it : ops)
    {
        int idx = it.second, val = it.first;
        v.push_back(val);
        id[idx] = ++cur;
    }
    reverse(ops.begin(), ops.end());

    SegmentTree st(k);
    FenwickTree bit(k);
    for (int i = 1; i <= k; i++)
        st.update(id[i], i);

    ll res = 0;
    int pos = 0;
    for (pair<int, int> it : cards)
    {
        int mx = it.first, i = it.second;

        while (pos < k && ops[pos].first >= mx)
        {
            int idx = ops[pos].second;
            pos++;

            st.update(id[idx], 0);
            bit.update(idx, 1);
        }

        int mn = min(a[i], b[i]);
        int Q = lower_bound(v.begin() + 1, v.end(), mn) - v.begin();
        if (Q == k + 1)
        {
            int num = bit.query(1, k);
            res += ((num % 2 == 0) ? a[i] : b[i]);
        } else
        {
            int index = st.query(Q, k);
            int num = (index == k ? 0 : bit.query(index + 1, k));
            if (index == 0)
                res += (num % 2 == 0 ? a[i] : b[i]);
            else
                res += (num % 2 == 0 ? (mx == a[i] ? a[i] : b[i]) : (mx == a[i] ? b[i] : a[i]));
        }
    }

    cout << res << '\n';
}

Compilation message (stderr)

fortune_telling2.cpp: In function 'int main()':
fortune_telling2.cpp:20:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   20 |         freopen((name + ".inp").c_str(), "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fortune_telling2.cpp:21:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   21 |         freopen((name + ".out").c_str(), "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...