답안 #340030

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
340030 2020-12-26T15:39:00 Z Sprdalo Money (IZhO17_money) C++17
0 / 100
9 ms 10624 KB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<double> vd;
typedef vector<bool> vb;
typedef vector<char> vc;
typedef vector<string> vs;
typedef vector<pi> vp;
typedef vector<pl> vpl;

template<int MAXN>
struct segtr{
    //To change the purpose of the segtree just redefine the operators
    struct node{
        int x;
        node(int x = 0) : x(x) {}
        node& operator+= (const node& other){
            x += other.x;
            return *this;
        }
        node operator+ (const node& other){
            node tmp = *this;
            return tmp += other;
        }
    };
    
    node a[2*MAXN];
    
    //Initialize the array
    void init(){
        for(int i = 1; i <= MAXN; ++i){
            a[i+MAXN-1] = node{};
        }
        for(int i = MAXN-1; i > 0; --i){
            a[i] = a[2*i] + a[2*i+1];
        }
    }
    
    //Sets the node and updates the tree
    void set(int pos, node val){
        pos += MAXN-1;
        a[pos] = val;
        
        while(pos > 1){
            pos /= 2;
            a[pos] = a[2*pos] + a[2*pos+1];
        }
    }
    inline void add(int pos, node val){ //Just forwards to set
        set(pos, node{a[pos+MAXN-1]+val});
    }
    
    //Gets the range query
    node get(int l, int r, int pos = 1, int rl = 1, int rr = MAXN){
        if(r < rl || rr < l){ return node{}; }
        if(l <= rl && rr <= r){ return a[pos]; }
        
        int rm = (rl+rr)/2;
        return get(l, r, 2*pos, rl, rm) + get(l, r, 2*pos+1, rm+1, rr);
    }
    
};
segtr<131072*10> drvo;

map<int, int> m;
signed main()
{
    ios_base::sync_with_stdio(false); 
    cin.tie(nullptr); 
    cout.tie(nullptr); 
    cerr.tie(nullptr);    

    int n;
    cin >> n;

    vi a(n);
    set<int> s;
    for (auto& i : a){
        cin >> i;
        s.insert(i);
    }

    int cur = 1;
    for (auto& i : s){
        m[i] = cur++;
    }

    for (auto& i : a){
        i = m[i];
    }

    drvo.init();

    int l = 0, r = 1, sol = 1;
    while(1){
        if (r == n) break;

        if (a[r] < a[r-1]){

            for (int i = l; i < r; ++i)
                drvo.set(a[i], 1);

            ++sol;
            l = r;
            r++;
            drvo.set(a[l], 1);
            continue;
        }

        if (a[l]+1 > a[r]-1){
            ++r;
            continue;
        }

        int x = drvo.get(a[l]+1, a[r]-1).x;
        if (!x){
            ++r;
            continue;
        }

        for (int i = l; i < r; ++i)
            drvo.set(a[i], 1);
        l = r;
        ++sol;
        ++r;
    }

    cout<< sol << '\n';
}
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 10624 KB Output is correct
2 Incorrect 9 ms 10604 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 10624 KB Output is correct
2 Incorrect 9 ms 10604 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 10624 KB Output is correct
2 Incorrect 9 ms 10604 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 10624 KB Output is correct
2 Incorrect 9 ms 10604 KB Output isn't correct
3 Halted 0 ms 0 KB -