Submission #1248915

#TimeUsernameProblemLanguageResultExecution timeMemory
1248915cpdreamerMagic Tree (CEOI19_magictree)C++20
11 / 100
104 ms17732 KiB
#include <wchar.h> #include<bits/stdc++.h> using namespace std; typedef long long ll; #define V vector #define pb push_back #define all(v) v.begin(),v.end() const long long MOD=1e9+7; #define P pair void file() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); } V<int>adj[(int)1e5+1]; int d[(int)1e5+1]; ll v[(int)1e5+1]; int dep[(int)1e5+1]; int l[(int)1e5+1],r[(int)1e5+1]; ll dp[(int)1e5+1]; struct segtree { private: struct node { ll val; }; node neutral={0LL}; node single( ll v) { return {v}; } node merge(node a,node b) { return {max(a.val,b.val)}; } public: int size; V<node>query; void init(int n) { size=1; while (size<n)size*=2; query.assign(2*size,neutral); } void set(int i,ll v,int x,int lx,int rx) { if (rx-lx==1) { query[x]=single(v); return; } int m=(lx+rx)/2; if (i<m) { set(i,v,2*x+1,lx,m); } else set(i,v,2*x+2,m,rx); query[x]=merge(query[2*x+1],query[2*x+2]); } void set(int i,int v) { set(i,v,0,0,size); } node calc(int l,int r,int x,int lx,int rx) { if (lx>=r || rx<=l) { return neutral; } if (l<=lx && rx<=r) { return query[x]; } int m=(lx+rx)/2; node a=calc(l,r,2*x+1,lx,m); node b=calc(l,r,2*x+2,m,rx); return merge(a,b); } ll calc(int l,int r) { return calc(l,r,0,0,size).val; } }; int cnt=0; void dfs(int n,int p) { l[n]=cnt; for (auto u:adj[n]) { if (u==p)continue; cnt++; dep[u]=dep[n]+1; dfs(u,n); } r[n]=cnt; } bool cus(int a,int b) { bool f1=(l[a]>=l[b] && l[a]<=r[b]); bool f2=(l[b]>=l[a] && l[b]<=r[a]); if (f2)return true; if (f1)return false; return d[a]>d[b]; } void solve() { int n,m,k; cin>>n>>m>>k; for (int i=2;i<=n;i++) { int a; cin>>a; adj[a].pb(i); adj[i].pb(a); } for (int i=1;i<=n;i++) { d[i]=k+1; } for (int i=0;i<m;i++) { int u,day; ll w; cin>>u>>day>>w; d[u]=day; v[u]=w; } int a[n]; for (int i=0;i<n;i++) { a[i]=i+1; } dfs(1,-1); sort(a,a+n,cus); ll ans=0; for (int i=0;i<=k;i++) { dp[i]=0; } segtree tree; tree.init(k+1); for (auto u:a) { if (d[u]>k)continue; ll x=tree.calc(d[u],k+1)+v[u]; ans=max(ans,x); if (x>dp[d[u]]) { dp[d[u]]=x; tree.set(d[u],x); } } cout<<ans<<endl; } int main(){ //file(); solve(); }

Compilation message (stderr)

magictree.cpp: In function 'void file()':
magictree.cpp:11:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   11 |     freopen("input.txt","r",stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
magictree.cpp:12:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   12 |     freopen("output.txt","w",stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...