제출 #909270

#제출 시각아이디문제언어결과실행 시간메모리
909270lightonMagic Tree (CEOI19_magictree)C++17
100 / 100
185 ms54492 KiB
#include<bits/stdc++.h>
#define forf(i,a,b) for(int i = a; i<=b; i++)
#define all(v) v.begin(),v.end()
using namespace std;
typedef long long ll;
int N,M,K;
int inf = 1e9;
struct ST{
    int t; ll v; int id;
    bool operator<(const ST &r) const{
        if(t==r.t) return id<r.id;
        return t<r.t;
    }
};
vector<int> adj[200001];
ST upd[200001];
void merg (set<ST> &a, set<ST> b){
    for(ST i : b) a.insert(i);
}
void add (set<ST> &now, ST a){
    ST tmp = a; tmp.id = inf;
    now.insert(a);
    auto it = now.upper_bound(tmp);
    ll sum = 0; int flag = 0;
    ST nxt;
    while(it != now.end() && sum <= a.v){
        sum += it->v;
        if(sum > a.v){
            nxt = *it;
            flag = 1;
        }
        it = now.erase(it);
    }
    if(flag){
        nxt.v = sum-a.v;
        now.insert(nxt);
    }
}

struct DSU{
    int grp[200001];
    set<ST> s[200001];
    void init(){
        forf(i,1,N) grp[i] =i ;
    }
    int fi(int x){
        if(grp[x] == x) return x;
        return grp[x] = fi(grp[x]);
    }
    void un(int x, int y){
        x = fi(x); y = fi(y);
        if(s[x].size() > s[y].size()) swap(x,y);
        merg(s[y],s[x]);
        grp[x] = y;
    }
} dsu;


void dfs(int now ,int p = -1){
    for(int &i : adj[now]){
        if(i==p) continue;
        dfs(i,now);
        dsu.un(now,i);
    }
    if(upd[now].id) add(dsu.s[dsu.fi(now)],upd[now]);
}

int main(){
    scanf("%d %d %d" , &N,&M,&K);
    forf(i,2,N){
        int t; scanf("%d" , &t);
        adj[i].push_back(t);
        adj[t].push_back(i);
    }
    forf(i,1,M){
        int u,t; ll v; scanf("%d %d %lld" , &u,&t, &v);
        upd[u] = {t,v,i};
    }
    dsu.init();
    dfs(1);
    ll ans = 0;
    for(ST i : dsu.s[dsu.fi(1)]) ans += i.v;
    printf("%lld" , ans);
}

컴파일 시 표준 에러 (stderr) 메시지

magictree.cpp: In function 'int main()':
magictree.cpp:69:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |     scanf("%d %d %d" , &N,&M,&K);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
magictree.cpp:71:21: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   71 |         int t; scanf("%d" , &t);
      |                ~~~~~^~~~~~~~~~~
magictree.cpp:76:29: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   76 |         int u,t; ll v; scanf("%d %d %lld" , &u,&t, &v);
      |                        ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#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...