Submission
Status:
(PPP-)(TSS)(TSSS)(-SSSSSS)(PPPPP-S)(TSSSSSSSSSS)(TSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS)
Subtask/Task Score:
{0/9}{0/5}{0/6}{0/11}{0/14}{0/25}{0/30}
Score: 0
User: kungarooo
Problemset: ผลึกเวลา (Crystal)
Language: cpp
Time: 2.085 second
Submitted On: 2025-11-17 00:34:41
#include<bits/stdc++.h>
using namespace std;
int u,k,n;
vector<vector<int>> dp,dp2;
vector<pair<int,int>> a[1000];
bool cmp(int a,int x){
return a>x;
}
void udp(int idx){
vector<int> st;
for(auto i:a[idx]){
//cout<<i.second<<" ";
auto it=lower_bound(st.begin(),st.end(),i.second);
dp[idx].push_back(it-st.begin()+1);
if(it==st.end())st.push_back(i.second);
else (*it)=i.second;
}
//cout<<"::\n";
}
void udp2(int idx){
vector<int> st;
for(int j=a[idx].size()-1;j>=0;j--){
pair<int,int> i=a[idx][j];
//cout<<i.second<<" ";
auto it=lower_bound(st.begin(),st.end(),i.second,cmp);
dp2[idx].push_back(it-st.begin()+1);
if(it==st.end())st.push_back(i.second);
else (*it)=i.second;
}
//cout<<"::\n";
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(NULL);
//time power lens idx
vector<tuple<int,int,int,int>> path;
cin>>u>>k>>n;
dp=vector<vector<int>>(u);
dp2=vector<vector<int>>(u);
for(int i=0;i<n;i++){
int p,w,t;
cin>>p>>w>>t;
a[w].push_back({t,p});
}
for(int i=0;i<u;i++){
sort(a[i].begin(),a[i].end());
int ooo=0;
for(auto j:a[i]){
path.push_back({j.first,j.second,i,ooo});
ooo++;
}
}
sort(path.begin(),path.end());
for(int i=0;i<u;i++){
udp(i);
}
for(int i=0;i<u;i++){
udp2(i);
}
for(int i=0;i<u;i++){
reverse(dp2[i].begin(),dp2[i].end());
}
int ans=1,lftmx=1;
int dpdp[n]={},pre[u]={};
for(int i=0;i<u;i++)pre[i]=-1;
for(int i=0;i<n;i++)dpdp[i]=1;
for(int i=n-2;i>=0;i--){
auto [time,power,lens,idx] = path[i];
dpdp[i]=dp2[lens][idx];
for(int j=i+1;j<n;j++){
if(get<2>(path[j])>power){
if(get<3>(path[j])==lens)dpdp[i]=max(dpdp[i],dpdp[j]+1);
else dpdp[i]=max(dpdp[i],dpdp[j]+1-k);
}
}
//if(pre[lens]!=-1)dpdp[i]=max(dpdp[i],1+dpdp[pre[lens]]);
//pre[lens]=i;
}
for(int i=0;i<n;i++){
auto [time,power,lens,idx] = path[i];
ans=max(ans,dp[lens][idx]);
ans=max(ans,dpdp[i]+dp[lens][idx]-1);
}
// for(int i=0;i<n;i++){
// cout<<dpdp[i]<<" "; }
// cout<<"\n";
cout<<ans;
return 0;
}
/*
1 0 10
1 0 1
23 0 2
12 0 3
13 0 4
6 0 5
16 0 6
700 0 7
81 0 8
90 0 9
10 0 10
*/