Submission #62876122


Source Code Expand

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define rep(i,n) for(int i=0; i<(int)(n); i++)
using i64 = long long;

/*
 *  永続セグメント木の実装
 */
struct Val { i64 sum=0; int cnt=0; };
Val operator+(Val l, Val r){ return { l.sum + r.sum, l.cnt + r.cnt }; }
struct Node { int l, r; Val sum; };
Node A[100000 * 20 * 3];
int nodecnt = 0;
Val nodesum(int i){ return i < 0 ? Val() : A[i].sum; }
int newMidNode(int l, int r){
    int p = nodecnt++;
    A[p].l = l; A[p].r = r;
    A[p].sum = nodesum(l) + nodesum(r);
    return p;
}
int newLeafNode(Val x){
    int p = nodecnt++;
    A[p].l = A[p].r = -1;
    A[p].sum = x;
    return p;
}
int constructSeg(int N){
    if(N == 0) return -1;
    if(N == 1) return newLeafNode(Val());
    return newMidNode(constructSeg(N/2), constructSeg((N+1)/2));
}
int updateSeg(int i, int l, int r, int p, Val val){
    if(l + 1 == r) return newLeafNode(val);
    int m = (l+r)/2;
    if(p < m) return newMidNode(updateSeg(A[i].l, l, m, p, val), A[i].r);
    return newMidNode(A[i].l, updateSeg(A[i].r, m, r, p, val));
}


int N, M, Q;
vector<int> bfs;
vector<int> parent;
vector<int> edgetowhere;

vector<int> segs;

/*
 *  根付き木としたときの各頂点の親を得る
 *  BFS 順を得る
 */
void inputTree(){
    vector<int> A(N-1), B(N-1);
    vector<vector<int>> E(N);
    rep(i,N-1){
        int u,v; cin >> u >> v; u--; v--;
        E[u].push_back(i);
        E[v].push_back(i);
        A[i] = u; B[i] = v;
    }
    bfs.assign(N, 0);
    parent.assign(N, -1);
    int p = 1;
    rep(i,N){
        int v = bfs[i];
        for(int e : E[v]) if(parent[v] != e){
            int w = A[e] ^ B[e] ^ v;
            bfs[p++] = w;
            parent[w] = e;
        }
    }
    edgetowhere.resize(N-1);
    rep(i,N) if(i != 0) edgetowhere[parent[i]] = i;
    rep(i,N) if(i!=0) parent[i] = A[parent[i]] ^ B[parent[i]] ^ i;
}

/*
 *  関所の情報を読み込み、永続セグメント木を構築
 */
void inputGates(){
    vector<vector<int>> gates(N);
    vector<pair<int, int>> gatesize(M);
    rep(i,M){
        int e, x; cin >> e >> x; e--;
        int p = edgetowhere[e];
        gates[p].push_back(i);
        gatesize[i] = { x, i };
    }
    sort(gatesize.begin(), gatesize.end());
    vector<int> ord(M);
    rep(i,M) ord[gatesize[i].second] = i;

    segs.assign(N, -1);
    segs[0] = constructSeg(M);
    for(int v : bfs) if(v != 0){
        int w = parent[v];
        int seg = segs[w];
        for(int gate : gates[v]){
            int idx = ord[gate];
            int sz = gatesize[idx].first;
            seg = updateSeg(seg, 0, M, idx, {sz,1});
        }
        segs[v] = seg;
    }
}

/*
 *  LCA の計算
 */
vector<vector<int>> PP;
vector<int> depth;
int PPD = 16;
void pptable(){
    PP.assign(PPD+1, vector<int>(N));
    PP[0] = parent;
    PP[0][0] = 0;
    rep(d,PPD) rep(i,N) PP[d+1][i] = PP[d][PP[d][i]];
    depth.assign(N, 0);
    for(int i : bfs) if(i != 0) depth[i] = depth[parent[i]] + 1;
}
int lca(int u, int v){
    if(depth[u] > depth[v]) swap(u, v);
    for(int d=PPD; d>=0; d--) if((depth[v] - depth[u]) & (1 << d)) v = PP[d][v];
    if(u == v) return u;
    for(int d=PPD; d>=0; d--) if(PP[d][u] != PP[d][v]){ u = PP[d][u]; v = PP[d][v]; }
    return parent[u];
}

/*
 *  質問を 1 つ処理
 */
int minGold(vector<pair<int, int>> I, i64 silv){
    int ans = 0;
    int l = 0, r = M;
    while(l + 1 < r){
        int m = (l+r)/2;
        i64 suml = 0;
        for(auto i : I) suml += nodesum(A[i.first].l).sum * i.second;
        if(suml <= silv){
            silv -= suml;
            for(auto& i : I) i.first = A[i.first].r;
            l=m;
        }
        else{
            for(auto i : I) ans += nodesum(A[i.first].r).cnt * i.second;
            for(auto& i : I) i.first = A[i.first].l;
            r=m;
        }
    }
    i64 sumx = 0;
    for(auto i : I) sumx += nodesum(i.first).sum * i.second;
    if(sumx > silv) for(auto i : I) ans += nodesum(i.first).cnt * i.second;
    return ans;
}

int main(){
    std::cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cin >> N >> M >> Q;
    inputTree();
    inputGates();
    pptable();
    rep(q,Q){
        int s, t, x; i64 y; cin >> s >> t >> x >> y; s--; t--;
        int g = lca(s, t);
        int gold = minGold({ {segs[s],1}, {segs[t],1}, {segs[g],-2} }, y);
        if(gold > x) cout << "-1\n"; else cout << (x-gold) << '\n';
    }
    return 0;
}

Submission Info

Submission Time
Task A - ふたつの通貨 (Two Currencies)
User Nachia
Language C++ 20 (gcc 12.2)
Score 100
Code Size 4619 Byte
Status AC
Exec Time 498 ms
Memory 154916 KiB

Judge Result

Set Name Sample Subtask1 Subtask2 Subtask3 Subtask4
Score / Max Score 0 / 0 10 / 10 28 / 28 30 / 30 32 / 32
Status
AC × 4
AC × 35
AC × 31
AC × 17
AC × 100
Set Name Test Cases
Sample sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt
Subtask1 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt, 01-27.txt, 01-28.txt, 01-29.txt, 01-30.txt, 01-31.txt, sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt
Subtask2 01-26.txt, 01-27.txt, 01-28.txt, 02-01.txt, 02-02.txt, 02-03.txt, 02-04.txt, 02-05.txt, 02-06.txt, 02-07.txt, 02-08.txt, 02-09.txt, 02-10.txt, 02-11.txt, 02-12.txt, 02-13.txt, 02-14.txt, 02-15.txt, 02-16.txt, 02-17.txt, 02-18.txt, 02-19.txt, 02-20.txt, 02-21.txt, 02-22.txt, 02-23.txt, 02-24.txt, 02-25.txt, 02-26.txt, 02-27.txt, sample-02.txt
Subtask3 01-29.txt, 01-30.txt, 01-31.txt, 03-01.txt, 03-02.txt, 03-03.txt, 03-04.txt, 03-05.txt, 03-06.txt, 03-07.txt, 03-08.txt, 03-09.txt, 03-10.txt, 03-11.txt, 03-12.txt, 03-13.txt, sample-03.txt
Subtask4 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt, 01-27.txt, 01-28.txt, 01-29.txt, 01-30.txt, 01-31.txt, 02-01.txt, 02-02.txt, 02-03.txt, 02-04.txt, 02-05.txt, 02-06.txt, 02-07.txt, 02-08.txt, 02-09.txt, 02-10.txt, 02-11.txt, 02-12.txt, 02-13.txt, 02-14.txt, 02-15.txt, 02-16.txt, 02-17.txt, 02-18.txt, 02-19.txt, 02-20.txt, 02-21.txt, 02-22.txt, 02-23.txt, 02-24.txt, 02-25.txt, 02-26.txt, 02-27.txt, 03-01.txt, 03-02.txt, 03-03.txt, 03-04.txt, 03-05.txt, 03-06.txt, 03-07.txt, 03-08.txt, 03-09.txt, 03-10.txt, 03-11.txt, 03-12.txt, 03-13.txt, 04-01.txt, 04-02.txt, 04-03.txt, 04-04.txt, 04-05.txt, 04-06.txt, 04-07.txt, 04-08.txt, 04-09.txt, 04-10.txt, 04-11.txt, 04-12.txt, 04-13.txt, 04-14.txt, 04-15.txt, 04-16.txt, 04-17.txt, 04-18.txt, 04-19.txt, 04-20.txt, 04-21.txt, 04-22.txt, 04-23.txt, 04-24.txt, 04-25.txt, sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt
Case Name Status Exec Time Memory
01-01.txt AC 56 ms 144224 KiB
01-02.txt AC 56 ms 144272 KiB
01-03.txt AC 56 ms 144236 KiB
01-04.txt AC 56 ms 144452 KiB
01-05.txt AC 56 ms 144368 KiB
01-06.txt AC 56 ms 144376 KiB
01-07.txt AC 56 ms 144444 KiB
01-08.txt AC 57 ms 144276 KiB
01-09.txt AC 56 ms 144296 KiB
01-10.txt AC 56 ms 144352 KiB
01-11.txt AC 56 ms 144348 KiB
01-12.txt AC 56 ms 144352 KiB
01-13.txt AC 56 ms 144336 KiB
01-14.txt AC 57 ms 144412 KiB
01-15.txt AC 57 ms 144360 KiB
01-16.txt AC 57 ms 144368 KiB
01-17.txt AC 58 ms 144384 KiB
01-18.txt AC 57 ms 144348 KiB
01-19.txt AC 56 ms 144316 KiB
01-20.txt AC 56 ms 144272 KiB
01-21.txt AC 56 ms 144372 KiB
01-22.txt AC 55 ms 144372 KiB
01-23.txt AC 56 ms 144372 KiB
01-24.txt AC 57 ms 144384 KiB
01-25.txt AC 57 ms 144300 KiB
01-26.txt AC 56 ms 144276 KiB
01-27.txt AC 55 ms 144360 KiB
01-28.txt AC 55 ms 144364 KiB
01-29.txt AC 56 ms 144288 KiB
01-30.txt AC 55 ms 144332 KiB
01-31.txt AC 56 ms 144368 KiB
02-01.txt AC 216 ms 154372 KiB
02-02.txt AC 225 ms 150660 KiB
02-03.txt AC 207 ms 152452 KiB
02-04.txt AC 185 ms 152708 KiB
02-05.txt AC 185 ms 153164 KiB
02-06.txt AC 285 ms 154116 KiB
02-07.txt AC 305 ms 154308 KiB
02-08.txt AC 285 ms 154844 KiB
02-09.txt AC 302 ms 154724 KiB
02-10.txt AC 283 ms 154336 KiB
02-11.txt AC 485 ms 153924 KiB
02-12.txt AC 497 ms 153848 KiB
02-13.txt AC 484 ms 154260 KiB
02-14.txt AC 396 ms 154276 KiB
02-15.txt AC 382 ms 154016 KiB
02-16.txt AC 428 ms 153728 KiB
02-17.txt AC 273 ms 153396 KiB
02-18.txt AC 263 ms 154160 KiB
02-19.txt AC 277 ms 153592 KiB
02-20.txt AC 261 ms 154264 KiB
02-21.txt AC 268 ms 154328 KiB
02-22.txt AC 255 ms 153532 KiB
02-23.txt AC 246 ms 154268 KiB
02-24.txt AC 194 ms 154048 KiB
02-25.txt AC 178 ms 154840 KiB
02-26.txt AC 197 ms 154808 KiB
02-27.txt AC 216 ms 154372 KiB
03-01.txt AC 270 ms 153720 KiB
03-02.txt AC 231 ms 152736 KiB
03-03.txt AC 306 ms 149568 KiB
03-04.txt AC 451 ms 153256 KiB
03-05.txt AC 477 ms 153112 KiB
03-06.txt AC 483 ms 153884 KiB
03-07.txt AC 358 ms 153424 KiB
03-08.txt AC 386 ms 153728 KiB
03-09.txt AC 387 ms 153296 KiB
03-10.txt AC 217 ms 153928 KiB
03-11.txt AC 226 ms 153184 KiB
03-12.txt AC 253 ms 153460 KiB
03-13.txt AC 251 ms 153896 KiB
04-01.txt AC 236 ms 152688 KiB
04-02.txt AC 224 ms 149808 KiB
04-03.txt AC 183 ms 149008 KiB
04-04.txt AC 323 ms 153740 KiB
04-05.txt AC 320 ms 154916 KiB
04-06.txt AC 316 ms 153896 KiB
04-07.txt AC 301 ms 154388 KiB
04-08.txt AC 315 ms 154392 KiB
04-09.txt AC 498 ms 153892 KiB
04-10.txt AC 463 ms 153992 KiB
04-11.txt AC 437 ms 154184 KiB
04-12.txt AC 423 ms 153452 KiB
04-13.txt AC 390 ms 153416 KiB
04-14.txt AC 413 ms 153636 KiB
04-15.txt AC 281 ms 153940 KiB
04-16.txt AC 267 ms 153400 KiB
04-17.txt AC 277 ms 153656 KiB
04-18.txt AC 270 ms 153632 KiB
04-19.txt AC 287 ms 153368 KiB
04-20.txt AC 306 ms 154276 KiB
04-21.txt AC 269 ms 154352 KiB
04-22.txt AC 204 ms 154072 KiB
04-23.txt AC 201 ms 154268 KiB
04-24.txt AC 208 ms 154232 KiB
04-25.txt AC 218 ms 154300 KiB
sample-01.txt AC 52 ms 144124 KiB
sample-02.txt AC 53 ms 144040 KiB
sample-03.txt AC 53 ms 144052 KiB
sample-04.txt AC 52 ms 144096 KiB