Submission #1133630

#TimeUsernameProblemLanguageResultExecution timeMemory
1133630CiprianMagic Tree (CEOI19_magictree)C++20
14 / 100
63 ms21292 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int N=2e5; int sgt[4*N]; vector<int>dp(N); vector<vector<int>>dp1(3, vector<int>(N)); vector<int>day(N), w(N), adj[N]; void dfs(int x, int p){ int sum1=0,sum2=0; for(auto e: adj[x]){ if(e==p)continue; dfs(e,x); sum1+=dp1[1][e]; sum2+=dp1[2][e]; }if(day[x]==1){ dp1[1][x]=sum1+w[x]; dp1[2][x]=sum2; }else if(day[x]==2){ dp1[1][x]=sum1; dp1[2][x]=max(sum2, sum1)+w[x]; }else{ dp1[1][x]=sum1; dp1[2][x]=sum2; } } 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); bool check1=true, check2=true; for(int i=2; i<=n; i++){ cin>>p[i]; if(p[i]!=i-1)check2=false; adj[p[i]].push_back(i); adj[i].push_back(p[i]); deg[p[i]]++; }int sum=0; for(int i=0; i<m; i++){ int v,d,w1; cin>>v>>d>>w1; day[v]=d; w[v]=w1; if(deg[v]!=0)check1=false; sum+=w1; }if(check1)cout<<sum<<endl; else if(check2){ 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; }else{ dfs(1, 1); cout<<max(dp1[1][1], dp1[2][1])<<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...