QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#863087#9742. 优秀的拆分REN5511WA 26ms3584kbC++233.3kb2025-01-19 13:00:242025-01-19 13:00:26

Judging History

你现在查看的是最新测评结果

  • [2025-01-19 13:00:26]
  • 评测
  • 测评结果:WA
  • 用时:26ms
  • 内存:3584kb
  • [2025-01-19 13:00:24]
  • 提交

answer

#include <iostream>
#include <vector>
#include <stack>
#include <unordered_map>
using namespace std;
int arr[200000 + 100];
int cpy[200000 + 100];
int up[200000 + 100];
int down[200000 + 100];
int tar[200000 + 100];
stack<pair<int, int>>mem;
unordered_map<int, bool>vis;
int main()
{
    int t;
    cin >> t;
    while (t--) {
        vis.clear();
        int n;
        int lenup = 0,lendown=0,downidx=0;
        int ans = 0;
        cin >> n;
        for (int i = 1; i <= n; i++) {
            cin >> arr[i];
        }
        for (int i = 1; i <= n; i++) {
            if (arr[i] >= up[lenup]) {
                up[++lenup] = arr[i];
                mem.push({ lenup, i });
                while (mem.size()) {
                    tar[mem.top().first] = arr[mem.top().second];
                    mem.pop();
                }
            }
            else {
                int k = lower_bound(up + 1, up + lenup + 1, arr[i]) - up;
                up[k] = arr[i];
                mem.push({ k, i });
                if (k == lenup) {
                    while (mem.size()) {
                        tar[mem.top().first] = arr[mem.top().second];
                        mem.pop();
                    }
                }
            }
        }
        for (int i = 1; i <= lenup; i++) {
            vis[tar[i]] = 1;
        }
        for (int i = 1; i <= n; i++) {
            if(vis[arr[i]]==0)
            cpy[++downidx] = arr[i];
        }
        down[0] = 1e9;
        for (int i = 1; i <= downidx; i++) {
            if (cpy[i] <= down[lendown]) {
                down[++lendown] = cpy[i];
            }
            else {
                int k = lower_bound(down + 1, down + lendown + 1, cpy[i],greater<int>()) - down;
                down[k] = cpy[i];
            }
        }
        ans = max(ans, lendown + lenup);
        ////
        lenup = 0, lendown = 0, downidx = 0;
        vis.clear();
        down[0] = 1e9;
        for (int i = 1; i <= n; i++) {
            if (arr[i] <= down[lendown]) {
                down[++lendown] = arr[i];
                mem.push({ lendown, i });
                while (mem.size()) {
                    tar[mem.top().first] = arr[mem.top().second];
                    mem.pop();
                }
            }
            else {
                int k = lower_bound(down + 1, down + lendown + 1, arr[i], greater<int>()) - down;
                down[k] = arr[i];
                mem.push({ k, i });
                if (k == lendown) {
                    while (mem.size()) {
                        tar[mem.top().first] = arr[mem.top().second];
                        mem.pop();
                    }
                }
            }
        }
        for (int i = 1; i <= lendown; i++) {
            vis[tar[i]] = 1;
        }
        for (int i = 1; i <= n; i++) {
            if (vis[arr[i]] == 0)
                cpy[++downidx] = arr[i];
        }

        for (int i = 1; i <= downidx; i++) {
            if (cpy[i] >= up[lenup]) {
                up[++lenup] = cpy[i];
            }
            else {
                int k = lower_bound(up + 1, up + lenup + 1, cpy[i]) - up;
                up[k] = cpy[i];
            }
        }
        ans = max(ans, lendown + lenup);
        cout << ans << "\n";
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3584kb

input:

3
5
3 5 1 4 2
4
1 2 4 3
5
3 5 2 1 4

output:

4
4
5

result:

ok 3 lines

Test #2:

score: -100
Wrong Answer
time: 26ms
memory: 3584kb

input:

20000
2
2 1
10
6 10 2 7 9 3 8 4 1 5
9
3 6 4 5 8 9 2 7 1
7
3 7 6 4 1 5 2
7
7 2 3 6 5 1 4
5
4 1 3 2 5
9
6 7 5 3 8 1 9 2 4
3
1 2 3
8
7 2 4 6 1 8 3 5
7
4 2 6 3 1 7 5
8
1 7 3 4 2 5 6 8
2
1 2
10
10 2 3 8 6 9 1 4 7 5
4
3 2 1 4
9
7 5 3 4 1 2 9 6 8
7
2 4 5 1 6 7 3
10
3 1 10 4 9 5 6 8 2 7
5
1 2 5 3 4
6
2 6 5 ...

output:

2
8
8
6
6
5
8
3
6
5
8
3
7
4
7
6
8
5
6
6
7
8
9
8
8
1
5
6
5
7
3
3
3
3
6
6
6
1
6
5
1
8
6
8
5
6
2
3
2
6
7
5
6
5
7
3
2
7
7
6
3
1
3
1
8
7
8
4
1
1
8
6
7
2
6
2
1
8
2
5
6
3
5
6
8
5
2
2
1
6
6
6
8
3
1
7
6
10
2
7
8
4
6
3
7
8
2
4
1
3
4
8
9
2
7
7
3
6
6
3
7
1
2
5
4
1
8
6
7
1
9
7
4
6
3
8
1
5
5
6
4
5
4
2
6
2
7
6
1
7...

result:

wrong answer 5th lines differ - expected: '7', found: '6'