Submission #955374

# Submission time Handle Problem Language Result Execution time Memory
955374 2024-03-30T09:56:01 Z Unforgettablepl Harbingers (CEOI09_harbingers) C++17
30 / 100
160 ms 65536 KB
#include <bits/stdc++.h>
using namespace std;

#define int long long

const int INF = 1e18;

struct line{
    int m,n;
    line(int m,int n):m(m),n(n){}
    int operator()(int x) const{
        return m*x+n;
    }
};

struct node{
    node *left,*right;
    int L,R;
    line lin;
    node(int L,int R): L(L), R(R), left(nullptr), right(nullptr), lin(0, INF){}
};

int query(node* curr,int x){
    if(curr==nullptr)return INF;
    int mid = (curr->L+curr->R)/2;
    if(mid==x)return curr->lin(x);
    if(mid<x)return min(curr->lin(x), query(curr->right, x));
    return min(curr->lin(x), query(curr->left, x));
}

void update(node* curr,line x, vector<pair<node*,node>> &updates){
    int mid = (curr->L+curr->R)/2;
    bool betterleft = curr->lin(curr->L) > x(curr->L);
    bool betterright = curr->lin(curr->R) > x(curr->R);
    bool bettermid = curr->lin(mid) > x(mid);
    if(!(betterleft or bettermid or betterright))return;
    if(bettermid and betterright and betterleft) {
        updates.emplace_back(curr,*curr);
        swap(x, curr->lin);
    }
    else if(betterleft and !bettermid){
        if(curr->left==nullptr)curr->left = new node(curr->L,mid-1);
        update(curr->left,x,updates);
    } else if(!bettermid){
        if(curr->right==nullptr)curr->right = new node(mid+1,curr->R);
        update(curr->right,x,updates);
    } else if(betterleft){
        updates.emplace_back(curr,*curr);
        swap(curr->lin,x);
        if(curr->right==nullptr)curr->right = new node(mid+1,curr->R);
        update(curr->right,x,updates);
    } else {
        updates.emplace_back(curr,*curr);
        swap(curr->lin, x);
        if(curr->left==nullptr)curr->left = new node(curr->L,mid-1);
        update(curr->left,x,updates);
    }
}



int DP[100001];
int S[100001];
int V[100001];
vector<pair<int,int>> adj[100001];
node* head = new node(1,1e9);

void dfs(int x,int p,int depth){
    DP[x] = S[x]+V[x]*depth+ query(head,V[x]);
    vector<pair<node*,node>> updates;
    update(head,line(-depth,DP[x]),updates);
    for(auto&i:adj[x])if(i.first!=p){
        dfs(i.first,x,depth+i.second);
    }
    for(auto&i:updates)*i.first=i.second;
}

int32_t main(){
//    freopen("harbingers.in","r",stdin);
//    freopen("harbingers.out","w",stdout);
    int n;
    cin >> n;
    for(int i=1;i<n;i++){
        int u,v,d;cin>>u>>v>>d;
        adj[u].emplace_back(v,d);
        adj[v].emplace_back(u,d);
    }
    for(int i=2;i<=n;i++)cin>>S[i]>>V[i];
    vector<pair<node*,node>> h;
    update(head,line(0,0),h);
    dfs(1,0,0);
    for(int i=2;i<n;i++)cout<<DP[i]<<' ';
    cout << DP[n] << '\n';
}

Compilation message

harbingers.cpp: In constructor 'node::node(long long int, long long int)':
harbingers.cpp:18:11: warning: 'node::R' will be initialized after [-Wreorder]
   18 |     int L,R;
      |           ^
harbingers.cpp:17:11: warning:   'node* node::left' [-Wreorder]
   17 |     node *left,*right;
      |           ^~~~
harbingers.cpp:20:5: warning:   when initialized here [-Wreorder]
   20 |     node(int L,int R): L(L), R(R), left(nullptr), right(nullptr), lin(0, INF){}
      |     ^~~~
# Verdict Execution time Memory Grader output
1 Correct 2 ms 4700 KB Output is correct
2 Correct 4 ms 5980 KB Output is correct
3 Runtime error 89 ms 44188 KB Memory limit exceeded
4 Runtime error 107 ms 65536 KB Execution killed with signal 9
5 Runtime error 148 ms 43160 KB Memory limit exceeded
6 Runtime error 160 ms 37716 KB Memory limit exceeded
7 Correct 108 ms 21876 KB Output is correct
8 Runtime error 153 ms 65536 KB Execution killed with signal 9
9 Runtime error 151 ms 65536 KB Execution killed with signal 9
10 Runtime error 142 ms 65536 KB Execution killed with signal 9