답안 #782985

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
782985 2023-07-14T13:40:50 Z RushB LIS (INOI20_lis) C++17
20 / 100
4000 ms 28224 KB
#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for (int i = (a); i < (b); i++) 
const int64_t INF = 1ll << 60;
const int N = 1e6 + 6;
const int SQ = 1000;
const int SQQ = 2000 + 5;

int n, x[N], p[N], a[N], S, q, ans[N], mx;
vector<int> V[N];
pair<int, int> M[SQQ];

void rebuild() {
        vector<int> x;
        for (int i = 0; V[i].size(); i++) {
                for (auto u: V[i]) x.push_back(u);
                V[i].clear();
        }
        mx = 0;
        FOR(i, 0, x.size()) {
                V[i / SQ].push_back(x[i]);
                mx = max(mx, (int) V[i / SQ].size());
        }
}
void add(vector<int> &v, int pos, int x) {
        vector<int> t;
        for (int i = 0; i < pos; i++) t.push_back(v[i]);
        t.push_back(x);
        for (int i = pos; i < v.size(); i++) t.push_back(v[i]);
        assert(t.size() == v.size() + 1);
        v = t;
        mx = max(mx, (int) v.size());
}

void seq() {
        FOR(i, 0, N) assert(V[i].empty());
        FOR(i, 0, q) {
                if (mx >= SQ) rebuild();
                int cur = p[i] - 1;
                for (int j = 0; j <= i; j++) {
                        if (cur > V[j].size()) cur -= V[j].size();
                        else {
                                add(V[j], cur, i);
                                cur = 0;
                                break;
                        }
                }
        }
        int ptr = 0;
        for (int i = 0; V[i].size(); i++) for (auto u: V[i]) a[ptr++] = u;
}

void solve() {
        int cnt = 0;
        while (true) {
                assert(++cnt <= 2000);
                pair<int, int> lis = {0, INF};
                fill(M, M + SQQ, lis);
                FOR(i, 0, q) {
                        pair<int, int> p = {0, INF};
                        FOR(j, 0, x[a[i]]) p = max(p, M[j]);
                        p.first++;
                        p.second = min(p.second, -a[i]);
                        lis = max(lis, p);
                        M[x[a[i]]] = max(M[x[a[i]]], p);
                }
                for (int i = q - 1; i >= -lis.second; i--) ans[i] = lis.first;
                if (lis.second == 0) return;
                vector<int> v;
                FOR(i, 0, q) if (a[i] < -lis.second) v.push_back(a[i]);
                q = v.size();
                copy(v.begin(), v.end(), a);
        }
}

signed main() {
        ios::sync_with_stdio(0), cin.tie(0);
        cin >> q;
        int tq = q;
        vector<int> X;
        FOR(i, 0, q) {
                cin >> p[i] >> x[i];
                X.push_back(x[i]);
        }
        sort(X.begin(), X.end());
        X.resize(unique(X.begin(), X.end()) - X.begin());
        FOR(i, 0, q) {
                x[i] = lower_bound(X.begin(), X.end(), x[i]) - X.begin() + 1;
        }
        assert(X.size() <= SQQ);
        seq();
        solve();
        FOR(i, 0, tq) cout << ans[i] << '\n';
}
//12:54:46

Compilation message

Main.cpp: In function 'void rebuild()':
Main.cpp:3:42: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    3 | #define FOR(i, a, b) for (int i = (a); i < (b); i++)
      |                                          ^
Main.cpp:20:9: note: in expansion of macro 'FOR'
   20 |         FOR(i, 0, x.size()) {
      |         ^~~
Main.cpp: In function 'void add(std::vector<int>&, int, int)':
Main.cpp:29:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |         for (int i = pos; i < v.size(); i++) t.push_back(v[i]);
      |                           ~~^~~~~~~~~~
Main.cpp: In function 'void seq()':
Main.cpp:41:33: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   41 |                         if (cur > V[j].size()) cur -= V[j].size();
      |                             ~~~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 23828 KB Output is correct
2 Correct 14 ms 23820 KB Output is correct
3 Correct 25 ms 23888 KB Output is correct
4 Correct 28 ms 23980 KB Output is correct
5 Correct 29 ms 23980 KB Output is correct
6 Correct 25 ms 23972 KB Output is correct
7 Correct 27 ms 24000 KB Output is correct
8 Correct 30 ms 24020 KB Output is correct
9 Correct 26 ms 23960 KB Output is correct
10 Correct 25 ms 23960 KB Output is correct
11 Correct 27 ms 23980 KB Output is correct
12 Correct 24 ms 23972 KB Output is correct
13 Correct 34 ms 23960 KB Output is correct
14 Correct 28 ms 23976 KB Output is correct
15 Correct 25 ms 23964 KB Output is correct
16 Correct 27 ms 23964 KB Output is correct
17 Correct 29 ms 24004 KB Output is correct
18 Correct 28 ms 24004 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 23828 KB Output is correct
2 Correct 14 ms 23820 KB Output is correct
3 Correct 25 ms 23888 KB Output is correct
4 Correct 28 ms 23980 KB Output is correct
5 Correct 29 ms 23980 KB Output is correct
6 Correct 25 ms 23972 KB Output is correct
7 Correct 27 ms 24000 KB Output is correct
8 Correct 30 ms 24020 KB Output is correct
9 Correct 26 ms 23960 KB Output is correct
10 Correct 25 ms 23960 KB Output is correct
11 Correct 27 ms 23980 KB Output is correct
12 Correct 24 ms 23972 KB Output is correct
13 Correct 34 ms 23960 KB Output is correct
14 Correct 28 ms 23976 KB Output is correct
15 Correct 25 ms 23964 KB Output is correct
16 Correct 27 ms 23964 KB Output is correct
17 Correct 29 ms 24004 KB Output is correct
18 Correct 28 ms 24004 KB Output is correct
19 Execution timed out 4065 ms 28224 KB Time limit exceeded
20 Halted 0 ms 0 KB -