제출 #1133618

#제출 시각아이디문제언어결과실행 시간메모리
1133618CiprianMagic Tree (CEOI19_magictree)C++20
14 / 100
57 ms6216 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int N=2e5; int sgt[4*N]; vector<int>dp(N); void build(int i, int l, int r){ if(l==r){ sgt[i]=dp[l]; return; }int mid=(l+r)/2; build(2*i, l, mid); build(2*i+1, mid+1, r); sgt[i]=max(sgt[2*i], sgt[2*i+1]); return; }void updt(int i, int l, int r, int idx, int val){ if(l<=idx && idx<=r){ if(l==r && idx==l){ sgt[i]=val; return; }int mid=(l+r)/2; updt(2*i, l, mid, idx,val); updt(2*i+1, mid+1, r, idx, val); sgt[i]=max(sgt[2*i], sgt[2*i+1]); return; }return; }int find(int i,int l,int r, int tl, int tr){ if(tl<=l && r<=tr){ return sgt[i]; }else if(tr<l || tl>r){ return 0; }int mid=(l+r)/2; int a=find(2*i, l, mid, tl, tr); int b=find(2*i+1, mid+1, r, tl, tr); return max(a,b); } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m,k; cin>>n>>m>>k; vector<int>p(n+2),deg(n+2); for(int i=2; i<=n; i++){ cin>>p[i]; deg[p[i]]++; }int sum=0; bool check=true; vector<int>day(n+4); for(int i=0; i<m; i++){ int v,d,w; cin>>v>>d>>w; day[v]=d; if(deg[v]!=0)check=false; sum+=w; }if(check)cout<<sum<<endl; else { build(1, 1, k); for(int i=n; i>=1; i--){ if(day[i]!=0){ dp[day[i]]=find(1, 1, k, 1, day[i])+1; updt(1, 1, k, day[i], dp[day[i]]); //cout<<day[i]<<" "<<dp[day[i]]<<endl; } }int mx=0; for(int i=1; i<=k; i++){ mx=max(mx,dp[i]); }cout<<mx<<endl; } return 0; }
#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...