Submission

Status:

(PPPP)(PPP)(PxSS)(PPPPPPP)(PPPPPPP)(PPPPPPPPPPP)(PPxSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS)

Subtask/Task Score:

{9/9}{5/5}{0/6}{11/11}{14/14}{25/25}{0/30}

Score: 64

User: meme_boi2

Problemset: ผลึกเวลา (Crystal)

Language: cpp

Time: 0.340 second

Submitted On: 2026-01-27 00:59:35

#include <bits/stdc++.h>
using namespace std;
int u, k, n,sz=1;
const int MAXN = 1e5+2;
vector<vector<int>> tree(1001);
map<int,int> mp;
bool cmp(tuple<int,int,int> a,tuple<int,int,int> b){
    return get<2>(a) < get<2>(b);
}
void update(int uni,int idx, int val){
    idx += sz;
    tree[uni][idx] = max(tree[uni][idx],val);
    idx /= 2;
    while(idx > 0){
        tree[uni][idx] = max(tree[uni][2*idx],tree[uni][2*idx+1]);
        idx /= 2;
    }
}
int query(int p,int l,int r){
    int ans = 0 ;
    l += sz; r+= sz;
    while(l <= r){
        if(l%2 == 1){
            ans = max(ans,tree[p][l]);
            l++;
        }
        if(r%2 == 0){
            ans = max(ans,tree[p][r]);
            r--;
        }
        l/=2; r/= 2;
    }
    return ans;
}
int32_t main(){
    cin.tie(nullptr)->sync_with_stdio(0);
    cin >> u >> k >> n;
    while(sz < n) sz*=2;
    for(int i = 0 ; i<= u; i++){
        tree[i].assign(2*sz,0);
    }
    // w p t
    vector<int> tmp;
    vector<tuple<int,int,int>> mat;
    for(int i = 0; i < n; i++){
        int w,p,t;
        cin >> w >> p >> t;
        mat.push_back(make_tuple(w,p,t));
        tmp.push_back(w);
    }
    sort(mat.begin(),mat.end(),cmp);
    sort(tmp.begin(),tmp.end());
    tmp.erase(unique(tmp.begin(),tmp.end()),tmp.end());
    for(int i =0;i < tmp.size(); i++){
        mp[tmp[i]] = i;
    }
    int LIS = 0;
  //  update(get<1>(mat[0]),mp[get<0>(mat[0])],1);
   // update(u,mp[get<0>(mat[0])],1);
    for(int i = 0; i < n; i++){
        int x = query(get<1>(mat[i]),0,mp[get<0>(mat[i])]-1), xx = query(u,0,mp[get<0>(mat[i])]-1);
     
        update(get<1>(mat[i]),mp[get<0>(mat[i])],max(x+1,xx+1-k));
        update(u,mp[get<0>(mat[i])],max(x+1,xx+1-k));

        LIS = max(LIS,max(x+1,xx+1-k));
    }
    cout << LIS;
}
/*
3 1 13
2 0 1
1 1 2
4 0 3
20 0 10
12 2 4
7 1 5
14 2 6
3 1 7
11 2 12
9 1 8
10 2 11
25 0 13
13 2 20
*/