제출 #1246956

#제출 시각아이디문제언어결과실행 시간메모리
1246956KindaGoodGamesMagic Tree (CEOI19_magictree)C++20
11 / 100
84 ms4024 KiB
#include<bits/stdc++.h>

using namespace std;
#define int long long
#define pii pair<int,int>

struct SegmentTree{
    int len = 1;
    vector<int> S;

    SegmentTree(int n){
        while(len < n){
            len <<= 1;
        }

        S.resize(2*len);
    }

    void upd(int i, int v){
        i += len;
        S[i] = v;
        for(i /= 2; i > 0; i /= 2){
            S[i] = max(S[i*2], S[i*2+1]);
        }
    }

    int query(int ql, int qr, int l = 0, int r = -2, int i=1){
        if(r == -2) r = len;

        if(ql <= l && r <= qr) return S[i];
        if(r <= ql || qr <= l) return 0;

        int mid = (l+r)/2;

        return max(query(ql,qr,l,mid,i*2), query(ql,qr,mid,r,i*2+1));
    }
};

int n, m, k; 
int32_t main(){
    cin >> n >> m >> k;  
    for(int i = 1; i < n; i++){
        int p;
        cin >> p; 
    }

    vector<pii> arr;
    for(int i = 0; i <m; i++){
        int v, d, w;
        cin >> v >> d >>w; 
        v--;
        arr.push_back({d,-v});
    }
    sort(arr.begin(),arr.end());

    SegmentTree seg(n);

    for(auto& [d,v] : arr){
        v*=-1;
        int ma = seg.query(v+1, n);
        seg.upd(v, ma+1);
    }
 
    cout << seg.query(0, n) << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...