Submission #737218

# Submission time Handle Problem Language Result Execution time Memory
737218 2023-05-06T23:56:53 Z Olympia Zoltan (COCI16_zoltan) C++17
91 / 140
768 ms 41260 KB
#include <iostream>
#include <set>
#include <cmath>
#include <queue>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <algorithm>
#include <cassert>
#include <map>
#include <deque>
using namespace std;
const int MOD = 1e9 + 7;
struct Node {
    int mx = 0;
    int64_t cnt = 0; 
    Node (int mx, int cnt) {
        this->mx = mx, this->cnt = cnt;
    }
};
struct SegmentTree {
    vector<Node> vec;
    Node id = Node(-1, 1);
    Node merge (Node left, Node right) {
        if (left.mx == -1) return right;
        if (right.mx == -1) return left;
        if (left.mx > right.mx) return left;
        if (left.mx < right.mx) return right;
        left.cnt += right.cnt;
        left.cnt %= MOD;
        return left;
    }   
    Node query (int dum, int tl, int tr, int l, int r) {
        if (tl >= l and tr <= r) {
            return vec[dum];
        } 
        if (r < tl or tr < l) {
            return id;
        }
        return merge(query(2 * dum + 1, tl, (tl + tr)/2, l, r), query(2 * dum + 2, (tl + tr)/2 + 1, tr, l, r));
    }
    Node query (int l, int r) {
        return query(0, 0, (int)vec.size()/2 - 1, l, r);
    }
    void update (int dum, Node node) {
        dum += (int)vec.size()/2 - 1;
        vec[dum] = node;
        while (dum != 0) {
            dum = (dum - 1)/2;
            vec[dum] = merge(vec[2 * dum + 1], vec[2 * dum + 2]);
        }
    }
    SegmentTree (int n) {
        n = (1 << (int)log2(n)) * 2;
        vec.assign(2 * n, id);
    }
};
vector<Node> lis (vector<int>& v) {
    SegmentTree st(v.size());
    map<int,vector<int>> oc;
    for (int i = 0; i < v.size(); i++) {
        oc[-v[i]].push_back(i);
    }
    vector<Node> vec;
    vec.push_back(Node(0, 1));
    int used = pow(2, v.size() - 1);
    for (auto& p: oc) {
        vector<Node> upd;
        for (int i: p.second) {
            Node node = st.query(i + 1, (int)v.size() - 1);
            if (node.mx == -1) {
                node = Node(1, 1);
            } else {
                node.mx += 1;
            }
            upd.push_back(node);
        }
        reverse(upd.begin(), upd.end());
        for (int i: p.second) {
            st.update(i, upd.back()), upd.pop_back();
        }
        Node g = st.id;
        for (int i: p.second) {
            g = st.merge(g, st.query(i, i));
        }
        vec.emplace_back(g);
    }
    return vec;
}
vector<Node> lds (vector<int>& v) {
    SegmentTree st(v.size());
    map<int,vector<int>> oc;
    for (int i = 0; i < v.size(); i++) {
        oc[v[i]].push_back(i);
    }
    vector<Node> vec;
    vec.push_back(Node(0, 1));
    for (auto& p: oc) {
        vector<Node> upd;
        for (int i: p.second) {
            Node node = st.query(i + 1, (int)v.size() - 1);
            if (node.mx == -1) {
                node = Node(1, 1);
            } else {
                node.mx += 1;
            }
            upd.push_back(node);
        }
        reverse(upd.begin(), upd.end());
        for (int i: p.second) {
            st.update(i, upd.back()), upd.pop_back();
        }
        vec.emplace_back(st.query(0, (int)v.size() - 1));
    }
    reverse(vec.begin(), vec.end());
    return vec;
}
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n;
    cin >> n;
    vector<int> v(n);
    for (int i = 0; i < n; i++) {
        cin >> v[i];
    }
    //reverse(v.begin(), v.end());
    auto a1 = lds(v);
    auto a2 = lis(v);
    int64_t mx = 0, cnt = 0;
    for (int i = 0; i < a1.size(); i++) {
        if (a1[i].mx + a2[i].mx > mx) {
            mx = a1[i].mx + a2[i].mx;
            cnt = (a1[i].cnt * a2[i].cnt) % MOD;
            cnt %= MOD;
        } else if (a1[i].mx + a2[i].mx == mx) {
            cnt += (a1[i].cnt * a2[i].cnt) % MOD;
            cnt %= MOD;
        }
    }
    for (int i = 0; i < n - mx; i++) {
        cnt *= 2;
        cnt %= MOD;
    }
    if (cnt % 2 == 0) cnt /= 2;
    else cnt = (cnt + MOD)/2 % MOD;   
    cout << mx << " " << cnt;
}

Compilation message

zoltan.cpp: In function 'std::vector<Node> lis(std::vector<int>&)':
zoltan.cpp:62:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |     for (int i = 0; i < v.size(); i++) {
      |                     ~~^~~~~~~~~~
zoltan.cpp:67:9: warning: unused variable 'used' [-Wunused-variable]
   67 |     int used = pow(2, v.size() - 1);
      |         ^~~~
zoltan.cpp: In function 'std::vector<Node> lds(std::vector<int>&)':
zoltan.cpp:94:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   94 |     for (int i = 0; i < v.size(); i++) {
      |                     ~~^~~~~~~~~~
zoltan.cpp: In function 'int main()':
zoltan.cpp:132:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Node>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  132 |     for (int i = 0; i < a1.size(); i++) {
      |                     ~~^~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 2 ms 468 KB Output is correct
8 Correct 2 ms 468 KB Output is correct
9 Correct 2 ms 468 KB Output is correct
10 Correct 2 ms 468 KB Output is correct
11 Runtime error 396 ms 35452 KB Memory limit exceeded
12 Correct 316 ms 32496 KB Output is correct
13 Correct 275 ms 25072 KB Output is correct
14 Correct 468 ms 32592 KB Output is correct
15 Runtime error 650 ms 37416 KB Memory limit exceeded
16 Runtime error 768 ms 41260 KB Memory limit exceeded
17 Runtime error 451 ms 36896 KB Memory limit exceeded
18 Runtime error 455 ms 36988 KB Memory limit exceeded
19 Runtime error 493 ms 36920 KB Memory limit exceeded
20 Runtime error 509 ms 36952 KB Memory limit exceeded