Submission #1137421

#TimeUsernameProblemLanguageResultExecution timeMemory
1137421icoder178Harbingers (CEOI09_harbingers)C++20
0 / 100
84 ms13128 KiB
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define int long long
const int maxv = (int) 4e18;
const int maxn = 100005;
int n,dst[maxn],dp[maxn],rmv[maxn],s[maxn],v[maxn];
vector<pair<int,int> > conn[maxn],cht;
inline void fdp(int pos) {
    int l = -5, r = cht.size()+5;
    while(l+1 < r) {
        int mid = (l+r)/2;
        bool isDecr;
        if(mid < 0) isDecr = true;
        else if(mid >= cht.size()-1) isDecr = false;
        else {
            int vl1 = cht[mid].second-v[pos]*cht[mid].first;
            int vl2 = cht[mid+1].second-v[pos]*cht[mid+1].first;
            isDecr = (vl2 < vl1);
        }
        if(isDecr == true) l = mid;
        else r = mid;
    }
    dp[pos] = cht[r].second-v[pos]*cht[r].first+v[pos]*dst[pos]+s[pos];
}
inline void prmv(int pos) {
    int l = -5, r = cht.size()+5;
    while(l+1 < r) {
        int mid = (l+r)/2;
        bool isV;
        if(mid < 0) isV = true;
        else if(mid >= ((int) cht.size())-1) isV = false;
        else {
            __int128_t x1 = cht[mid].first;
            __int128_t y1 = cht[mid].second;
            __int128_t x2 = cht[mid+1].first;
            __int128_t y2 = cht[mid+1].second;
            __int128_t x3 = dst[pos];
            __int128_t y3 = dp[pos];
            __int128_t v1 = (y3-y2)*(x2-x1);
            __int128_t v2 = (y2-y1)*(x3-x2);
            isV = (v1 > v2);
        }
        if(isV) l = mid;
        else r = mid;
    }
    rmv[pos] = r+1;
}
void dfs(int pos, int prevP) {
    // vector<pair<int,int> > nconn;
    // for(int i = 0; i < conn[pos].size(); i++) {
    //     int targP = conn[pos][i].first;
    //     int newV = conn[pos][i].second;
    //     if(targP != prevP) {
    //         dst[targP] = dst[pos]+newV;
    //         fdp(targP);
    //         prmv(targP);
    //         nconn.push_back(make_pair(rmv[targP],targP));
    //     }
    // }
    // vector<pair<int,int> > rmvd;
    // sort(nconn.begin(),nconn.end());
    // for(int i = ((int) nconn.size())-1; i >= 0; i--) {
    //     while(cht.size() > nconn[i].first) {
    //         rmvd.push_back(cht.back());
    //         cht.pop_back();
    //     }
    //     int targP = nconn[i].second;
    //     cht.push_back(make_pair(dst[targP],dp[targP]));
    //     dfs(targP,pos);
    //     cht.pop_back();
    // }
    // for(int i = ((int) rmvd.size())-1; i >= 0; i--) {
    //     cht.push_back(rmvd[i]);
    // }
    for(int i = 0; i < conn[pos].size(); i++) {
        int targP = conn[pos][i].first;
        if(targP != prevP) {
            dfs(targP,pos);
        }
    }
}
signed main () {
    scanf("%lld",&n);
    for(int i = 0; i < n-1; i++) {
        int a,b,c;
        scanf("%lld%lld%lld",&a,&b,&c);
        conn[a].push_back(make_pair(b,c));
        conn[b].push_back(make_pair(a,c));
    }
    for(int i = 2; i <= n; i++) {
        scanf("%lld%lld",&s[i],&v[i]);
    }
    cht.push_back(make_pair(0,0));
    dfs(1,-1);
    for(int i = 2; i <= n; i++) {
        printf("%lld ",dp[i]);
    }
    printf("\n");
    return 0;
}

Compilation message (stderr)

harbingers.cpp: In function 'int main()':
harbingers.cpp:85:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   85 |     scanf("%lld",&n);
      |     ~~~~~^~~~~~~~~~~
harbingers.cpp:88:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   88 |         scanf("%lld%lld%lld",&a,&b,&c);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
harbingers.cpp:93:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   93 |         scanf("%lld%lld",&s[i],&v[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...