답안 #595978

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
595978 2022-07-14T08:29:31 Z 이동현(#8445) Sushi (JOI16_sushi) C++17
20 / 100
12000 ms 29920 KB
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
using namespace std;

const int BS = 2000;
multiset<int> num[BS];
multiset<int> que[BS];
int ask[25004][3], lst[BS];

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int B = 500;
    int n, q; cin >> n >> q;
    //n = 400000, q = 25000;
    vector<int> a(n);
    for(int i = 0; i < n; ++i){
        cin >> a[i];
       // a[i] = i + 1;
        num[i / B].insert(a[i]);
    }
    for(int i = 0; i < q; ++i){
        cin >> ask[i][0] >> ask[i][1] >> ask[i][2];
        lst[ask[i][0] / B] = lst[ask[i][1] / B] = i;
        if(ask[i][0] > ask[i][1]) lst[0] = lst[(n - 1) / B] = i;
    }
    for(int qq = 0; qq < q; ++qq){
        int x, y, k;
        x = ask[qq][0] - 1, y = ask[qq][1] - 1, k = ask[qq][2];
       // x = 0, y = n - 1, k = q + 300;
        auto sol = [&](int x, int y, int k)->int{
            auto doque = [&](int pos)->void{
                int bp = pos / B;
                if(!(int)que[bp].size()){
                    return;
                }
                int l = bp * B, r = min(n, l + B);
                if((int)que[bp].size() == 1){
                    int val = *que[bp].begin();
                    for(int i = l; i < r; ++i) if(val < a[i]) swap(val, a[i]);
                }
                else if((int)que[bp].size() == 2){
                    int v1 = *que[bp].begin(), v2 = *(--que[bp].end());
                    for(int i = l; i < r; ++i){
                        if(v1 < a[i]) swap(v1, a[i]);
                        if(v2 < a[i]) swap(v2, a[i]);
                    }
                }
                else if((int)que[bp].size() == 3){
                    int v1 = *que[bp].begin(), v2 = *(--(--que[bp].end())), v3 = *(--que[bp].end());
                    for(int i = l; i < r; ++i){
                        if(v1 < a[i]) swap(v1, a[i]);
                        if(v2 < a[i]) swap(v2, a[i]);
                        if(v3 < a[i]) swap(v3, a[i]);
                    }
                }
                else if((int)que[bp].size() == 4){
                    int v1 = *que[bp].begin(), v2 = *(++que[bp].begin()), v3 = *(--(--que[bp].end())), v4 = *(--que[bp].end());
                    for(int i = l; i < r; ++i){
                        if(v1 < a[i]) swap(v1, a[i]);
                        if(v2 < a[i]) swap(v2, a[i]);
                        if(v3 < a[i]) swap(v3, a[i]);
                        if(v4 < a[i]) swap(v4, a[i]);
                    }
                }
                else{
                    for(int i = l; i < r; ++i){
                        que[bp].insert(a[i]);
                        a[i] = *(que[bp].begin());
                        que[bp].erase(que[bp].begin());
                    }
                }
                que[bp].clear();
            };
            int xb = x / B, yb = y / B;
            int xl = xb * B, xr = min(n, xl + B);
            int yl = yb * B, yr = min(n, yl + B);
            if(xl < x) doque(x);
            if(y + 1 < yr) doque(y);
            if(x == xl) --xb, xl -= B, xr -= B;
            if(y + 1 == yr) ++yb, yl += B, yr += B;

            if(xb < yb){
                for(int i = x; i < xr; ++i){
                    if(a[i] > k){
                        auto p = num[xb].lower_bound(a[i]);
                        num[xb].erase(p);
                        swap(a[i], k);
                        num[xb].insert(a[i]);
                    }
                }
                for(int i = xb + 1; i < yb; ++i){
                    if(lst[i] > qq) que[i].insert(k);
                    if(k < *(--num[i].end())){
                        num[i].insert(k);
                        k = *(--num[i].end());
                        num[i].erase(--num[i].end());
                    }
                }
                for(int i = yl; i <= y; ++i){
                    if(a[i] > k){
                        auto p = num[yb].lower_bound(a[i]);
                        num[yb].erase(p);
                        swap(a[i], k);
                        num[yb].insert(a[i]);
                    }
                }
            }
            else{
                for(int i = x; i <= y; ++i){
                    if(a[i] > k){
                        auto p = num[xb].lower_bound(a[i]);
                        num[xb].erase(p);
                        swap(a[i], k);
                        num[xb].insert(a[i]);
                    }
                }
            }
            return k;
        };
        //if(x <= y) sol(x, y, k);
        //else sol(0, y, sol(x, n - 1, k));
        if(x <= y) cout << sol(x, y, k) << '\n';
        else cout << sol(0, y, sol(x, n - 1, k)) << '\n';
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 668 KB Output is correct
2 Correct 8 ms 596 KB Output is correct
3 Correct 8 ms 596 KB Output is correct
4 Correct 9 ms 596 KB Output is correct
5 Correct 7 ms 596 KB Output is correct
6 Correct 8 ms 660 KB Output is correct
7 Correct 5 ms 644 KB Output is correct
8 Correct 5 ms 596 KB Output is correct
9 Correct 10 ms 596 KB Output is correct
10 Correct 8 ms 596 KB Output is correct
11 Correct 58 ms 644 KB Output is correct
12 Correct 48 ms 596 KB Output is correct
13 Correct 42 ms 656 KB Output is correct
14 Correct 15 ms 648 KB Output is correct
15 Correct 14 ms 596 KB Output is correct
16 Correct 3 ms 568 KB Output is correct
17 Correct 0 ms 468 KB Output is correct
18 Correct 0 ms 468 KB Output is correct
19 Correct 1 ms 468 KB Output is correct
20 Correct 0 ms 468 KB Output is correct
21 Correct 0 ms 468 KB Output is correct
22 Correct 0 ms 468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6536 ms 23780 KB Output is correct
2 Correct 6776 ms 23704 KB Output is correct
3 Correct 174 ms 23460 KB Output is correct
4 Correct 6664 ms 23812 KB Output is correct
5 Correct 5609 ms 22488 KB Output is correct
6 Correct 6010 ms 23744 KB Output is correct
7 Correct 6080 ms 23756 KB Output is correct
8 Correct 5852 ms 23672 KB Output is correct
9 Correct 299 ms 23528 KB Output is correct
10 Correct 5407 ms 22476 KB Output is correct
11 Correct 290 ms 23456 KB Output is correct
12 Correct 5476 ms 23648 KB Output is correct
13 Correct 6620 ms 23944 KB Output is correct
14 Correct 6571 ms 23840 KB Output is correct
15 Correct 143 ms 22272 KB Output is correct
16 Correct 6288 ms 23660 KB Output is correct
17 Correct 5550 ms 23644 KB Output is correct
18 Correct 6400 ms 23696 KB Output is correct
19 Correct 6174 ms 23720 KB Output is correct
20 Correct 5773 ms 22576 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 668 KB Output is correct
2 Correct 8 ms 596 KB Output is correct
3 Correct 8 ms 596 KB Output is correct
4 Correct 9 ms 596 KB Output is correct
5 Correct 7 ms 596 KB Output is correct
6 Correct 8 ms 660 KB Output is correct
7 Correct 5 ms 644 KB Output is correct
8 Correct 5 ms 596 KB Output is correct
9 Correct 10 ms 596 KB Output is correct
10 Correct 8 ms 596 KB Output is correct
11 Correct 58 ms 644 KB Output is correct
12 Correct 48 ms 596 KB Output is correct
13 Correct 42 ms 656 KB Output is correct
14 Correct 15 ms 648 KB Output is correct
15 Correct 14 ms 596 KB Output is correct
16 Correct 3 ms 568 KB Output is correct
17 Correct 0 ms 468 KB Output is correct
18 Correct 0 ms 468 KB Output is correct
19 Correct 1 ms 468 KB Output is correct
20 Correct 0 ms 468 KB Output is correct
21 Correct 0 ms 468 KB Output is correct
22 Correct 0 ms 468 KB Output is correct
23 Correct 6536 ms 23780 KB Output is correct
24 Correct 6776 ms 23704 KB Output is correct
25 Correct 174 ms 23460 KB Output is correct
26 Correct 6664 ms 23812 KB Output is correct
27 Correct 5609 ms 22488 KB Output is correct
28 Correct 6010 ms 23744 KB Output is correct
29 Correct 6080 ms 23756 KB Output is correct
30 Correct 5852 ms 23672 KB Output is correct
31 Correct 299 ms 23528 KB Output is correct
32 Correct 5407 ms 22476 KB Output is correct
33 Correct 290 ms 23456 KB Output is correct
34 Correct 5476 ms 23648 KB Output is correct
35 Correct 6620 ms 23944 KB Output is correct
36 Correct 6571 ms 23840 KB Output is correct
37 Correct 143 ms 22272 KB Output is correct
38 Correct 6288 ms 23660 KB Output is correct
39 Correct 5550 ms 23644 KB Output is correct
40 Correct 6400 ms 23696 KB Output is correct
41 Correct 6174 ms 23720 KB Output is correct
42 Correct 5773 ms 22576 KB Output is correct
43 Correct 5491 ms 29920 KB Output is correct
44 Correct 5730 ms 29644 KB Output is correct
45 Correct 5077 ms 29588 KB Output is correct
46 Correct 5194 ms 29600 KB Output is correct
47 Correct 5372 ms 29552 KB Output is correct
48 Execution timed out 12073 ms 29688 KB Time limit exceeded
49 Halted 0 ms 0 KB -