제출 #897738

#제출 시각아이디문제언어결과실행 시간메모리
897738Mr_HusanboyTwo Currencies (JOI23_currencies)C++17
0 / 100
2 ms1116 KiB
#include<bits/stdc++.h>

using namespace std;
using ll = long long;

#define ff first
#define ss second
#define all(a) (a).begin(), (a).end()

template<typename T>
int len(T &a){
    return a.size();
}

void solve(){
    int n, m, q; cin >> n >> m >> q;

    vector<vector<pair<int,int>>> g(n);

    for(int i = 0; i < n - 1; i ++){
        int u, v; cin >> u >> v;
        u --; v --;
        g[u].push_back({v, i});
        g[v].push_back({u, i});
    }

    vector<vector<int>> way(n - 1);
    for(int i = 0; i < m; i ++){
        int id, sil; cin >> id >> sil;
        id --; way[id].push_back(sil);
    }

    vector<int> st(q), en(q), gold(q), silver(q);

    for(int i = 0; i < q; i ++){
        cin >> st[i] >> en[i] >> gold[i] >> silver[i];
        st[i] --; en[i] --;
    }

    auto brute = [&]{

        vector<int> par(n), wayid(n);
        auto dfs = [&](auto &dfs, int i, int p = -1, int r = -1)->void{
            par[i] = p;
            wayid[i] = r;
            for(auto [u, id] : g[i]){
                if(u == p) continue;
                dfs(dfs, u, i, id);
            }
        };

        for(int i = 0; i < q; i ++){
            dfs(dfs, st[i]);

            vector<ll> pay;

            int cur = en[i];
            while(wayid[cur] != -1){
                //cout << wayid[cur] + 1 << ' ';
                for(auto u : way[wayid[cur]]){
                    pay.push_back(u);
                    //cout << u << ' ';
                }
                cur = par[cur];
            }
            sort(all(pay));
            for(int j = 1; j < len(pay); j ++){
                pay[j] += pay[j - 1];
            }

            int rem = gold[i] - len(pay) + (upper_bound(all(pay), silver[i]) - pay.begin());
            cout << max(-1, rem) << '\n';
        }
    };

    brute();
}

int main(){
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

    int testcases = 1;

    #ifdef Tests
    cin >> testcases;
    #endif

    while(testcases --){
        solve();
        if(testcases) cout << '\n';
        #ifdef LOCAL
        else
        cout << '\n';
        cout << "________________________" << endl;
        #endif
    }
    #ifdef LOCAL
    cout << "done" << endl;
    #endif
    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...