Submission #767884

# Submission time Handle Problem Language Result Execution time Memory
767884 2023-06-27T09:03:57 Z Dan4Life Two Currencies (JOI23_currencies) C++17
100 / 100
817 ms 165924 KB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ar = array<ll,2>;
#define pb push_back
#define sz(a) (int)a.size()
const int mxN = (int)1e5+10;
const int mxN2 = mxN*240;
const int INF = (int)1e9;
const int mxLg = 17;
 
ar seg[mxN2];
int n, m, q, IND=1;
int jmp[mxLg][mxN];
vector<int> v[mxN];
vector<ar> adj[mxN];
int L[mxN2], R[mxN2];
int lev[mxN], ro[mxN];
 
int newChild(int p, int v){
    int p2 = ++IND;
    L[p2] = L[p], R[p2] = R[p];
    seg[p2]={seg[p][0]+v,seg[p][1]+1};
    return p2;
}
 
int newPar(int l, int r){
    int p = ++IND; L[p] = l, R[p] = r;
    seg[p][0] = seg[l][0]+seg[r][0];
    seg[p][1] = seg[l][1]+seg[r][1];
    return p;
}
 
int upd(int x, int v, int p, int l=1, int r=INF){
    if(!p) return p;
    if(l==r) return newChild(p,v);
    int mid = (l+r)/2;
    if(!L[p]) L[p]=++IND;
    if(!R[p]) R[p]=++IND;
    if(x<=mid) return newPar(upd(x,v,L[p],l,mid),R[p]);
    return newPar(L[p],upd(x,v,R[p],mid+1,r));
}
 
ll query(ll x, int p1, int p2, int p3, int l=1, int r=INF){
    if(l==r) return min(seg[p1][1]+seg[p2][1]-2*seg[p3][1], x/l);
    int mid = (l+r)/2; ar ans = {0,0};
    ll ltot = seg[L[p1]][0]+seg[L[p2]][0]-2*seg[L[p3]][0];
    int lntot = seg[L[p1]][1]+seg[L[p2]][1]-2*seg[L[p3]][1];
    if(ltot>=x) return query(x,L[p1],L[p2],L[p3],l,mid);
    return query(x-ltot,R[p1],R[p2],R[p3],mid+1,r)+lntot;
}
 
void dfs(int s, int p){
    jmp[0][s]=p; lev[s] = lev[p]+1;
    for(auto [u,w] : adj[s]){
        if(u==p) continue; ro[u] = ro[s];
        for(auto x : v[w]) ro[u] = upd(x,x,ro[u]);
        dfs(u,s);
    }
}
 
int getPath(int x, int k){
    for(int i = mxLg-1; i>=0; i--)
        if((k>>i)&1) x=jmp[i][x];
    return x;
}
 
int lca(int a, int b){
    if(a==b) return a;
    if(jmp[0][a]==jmp[0][b]) return jmp[0][a];
    if(lev[a]>lev[b]) swap(a,b);
    b = getPath(b,lev[b]-lev[a]);
    for(int i = mxLg-1; i>=0; i--)
        if(jmp[i][a]!=jmp[i][b] and jmp[i][a])
            a=jmp[i][a], b=jmp[i][b];
    return lca(a,b);
}
 
int main(){
	ios_base::sync_with_stdio(false); cin.tie(0);
	cin >> n >> m >> q; 
    int p, c, a, b; ro[1]=1;
    for(int i = 1; i < n; i++)
        cin >> a >> b, adj[a].pb({b,i}), adj[b].pb({a,i});
    for(int i = 1; i <= m; i++)
        cin >> p >> c, v[p].pb(c);
    dfs(1,0);
    for(int i = 1; i < mxLg; i++)
        for(int j = 1; j <= n; j++)
            jmp[i][j] = jmp[i-1][jmp[i-1][j]];
    for(int i = 0; i < q; i++){
        ll s, t, x, y, z; cin >> s >> t >> x >> y;
        z = ro[lca(s,t)], s = ro[s], t = ro[t];
        int num = seg[s][1]+seg[t][1]-2*seg[z][1];
        cout << max(-1ll, x-(num-query(y,s,t,z))) << "\n";
    }
}

Compilation message

currencies.cpp: In function 'll query(ll, int, int, int, int, int)':
currencies.cpp:46:27: warning: unused variable 'ans' [-Wunused-variable]
   46 |     int mid = (l+r)/2; ar ans = {0,0};
      |                           ^~~
currencies.cpp: In function 'void dfs(int, int)':
currencies.cpp:56:9: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   56 |         if(u==p) continue; ro[u] = ro[s];
      |         ^~
currencies.cpp:56:28: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   56 |         if(u==p) continue; ro[u] = ro[s];
      |                            ^~
# Verdict Execution time Memory Grader output
1 Correct 2 ms 5076 KB Output is correct
2 Correct 2 ms 5076 KB Output is correct
3 Correct 2 ms 5076 KB Output is correct
4 Correct 3 ms 5032 KB Output is correct
5 Correct 8 ms 8404 KB Output is correct
6 Correct 7 ms 8400 KB Output is correct
7 Correct 6 ms 7636 KB Output is correct
8 Correct 7 ms 8756 KB Output is correct
9 Correct 7 ms 8760 KB Output is correct
10 Correct 7 ms 8632 KB Output is correct
11 Correct 7 ms 8660 KB Output is correct
12 Correct 7 ms 8752 KB Output is correct
13 Correct 8 ms 8916 KB Output is correct
14 Correct 8 ms 8892 KB Output is correct
15 Correct 8 ms 8776 KB Output is correct
16 Correct 7 ms 8788 KB Output is correct
17 Correct 7 ms 8800 KB Output is correct
18 Correct 7 ms 8764 KB Output is correct
19 Correct 7 ms 8660 KB Output is correct
20 Correct 7 ms 8680 KB Output is correct
21 Correct 7 ms 8632 KB Output is correct
22 Correct 10 ms 8628 KB Output is correct
23 Correct 10 ms 8720 KB Output is correct
24 Correct 9 ms 8688 KB Output is correct
25 Correct 7 ms 8660 KB Output is correct
26 Correct 7 ms 8660 KB Output is correct
27 Correct 7 ms 8764 KB Output is correct
28 Correct 8 ms 8760 KB Output is correct
29 Correct 7 ms 8660 KB Output is correct
30 Correct 6 ms 6972 KB Output is correct
31 Correct 6 ms 6868 KB Output is correct
32 Correct 5 ms 6868 KB Output is correct
33 Correct 8 ms 8896 KB Output is correct
34 Correct 8 ms 8844 KB Output is correct
35 Correct 8 ms 8892 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 5108 KB Output is correct
2 Correct 6 ms 6964 KB Output is correct
3 Correct 5 ms 6868 KB Output is correct
4 Correct 6 ms 6868 KB Output is correct
5 Correct 184 ms 86348 KB Output is correct
6 Correct 214 ms 76564 KB Output is correct
7 Correct 210 ms 66324 KB Output is correct
8 Correct 167 ms 64480 KB Output is correct
9 Correct 169 ms 68524 KB Output is correct
10 Correct 244 ms 93900 KB Output is correct
11 Correct 250 ms 91560 KB Output is correct
12 Correct 268 ms 93904 KB Output is correct
13 Correct 248 ms 93900 KB Output is correct
14 Correct 240 ms 93888 KB Output is correct
15 Correct 365 ms 102512 KB Output is correct
16 Correct 318 ms 103096 KB Output is correct
17 Correct 403 ms 102140 KB Output is correct
18 Correct 354 ms 94048 KB Output is correct
19 Correct 288 ms 93968 KB Output is correct
20 Correct 295 ms 94024 KB Output is correct
21 Correct 170 ms 93440 KB Output is correct
22 Correct 170 ms 93368 KB Output is correct
23 Correct 175 ms 93408 KB Output is correct
24 Correct 198 ms 93428 KB Output is correct
25 Correct 214 ms 93468 KB Output is correct
26 Correct 206 ms 93512 KB Output is correct
27 Correct 197 ms 93448 KB Output is correct
28 Correct 191 ms 91568 KB Output is correct
29 Correct 162 ms 93800 KB Output is correct
30 Correct 172 ms 93880 KB Output is correct
31 Correct 179 ms 93884 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 5076 KB Output is correct
2 Correct 7 ms 8904 KB Output is correct
3 Correct 8 ms 8936 KB Output is correct
4 Correct 7 ms 8868 KB Output is correct
5 Correct 400 ms 118704 KB Output is correct
6 Correct 384 ms 100016 KB Output is correct
7 Correct 568 ms 146272 KB Output is correct
8 Correct 757 ms 165924 KB Output is correct
9 Correct 762 ms 165600 KB Output is correct
10 Correct 728 ms 165564 KB Output is correct
11 Correct 619 ms 165020 KB Output is correct
12 Correct 654 ms 165132 KB Output is correct
13 Correct 633 ms 164948 KB Output is correct
14 Correct 354 ms 165520 KB Output is correct
15 Correct 343 ms 165452 KB Output is correct
16 Correct 437 ms 165600 KB Output is correct
17 Correct 414 ms 165500 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 5076 KB Output is correct
2 Correct 2 ms 5076 KB Output is correct
3 Correct 2 ms 5076 KB Output is correct
4 Correct 3 ms 5032 KB Output is correct
5 Correct 8 ms 8404 KB Output is correct
6 Correct 7 ms 8400 KB Output is correct
7 Correct 6 ms 7636 KB Output is correct
8 Correct 7 ms 8756 KB Output is correct
9 Correct 7 ms 8760 KB Output is correct
10 Correct 7 ms 8632 KB Output is correct
11 Correct 7 ms 8660 KB Output is correct
12 Correct 7 ms 8752 KB Output is correct
13 Correct 8 ms 8916 KB Output is correct
14 Correct 8 ms 8892 KB Output is correct
15 Correct 8 ms 8776 KB Output is correct
16 Correct 7 ms 8788 KB Output is correct
17 Correct 7 ms 8800 KB Output is correct
18 Correct 7 ms 8764 KB Output is correct
19 Correct 7 ms 8660 KB Output is correct
20 Correct 7 ms 8680 KB Output is correct
21 Correct 7 ms 8632 KB Output is correct
22 Correct 10 ms 8628 KB Output is correct
23 Correct 10 ms 8720 KB Output is correct
24 Correct 9 ms 8688 KB Output is correct
25 Correct 7 ms 8660 KB Output is correct
26 Correct 7 ms 8660 KB Output is correct
27 Correct 7 ms 8764 KB Output is correct
28 Correct 8 ms 8760 KB Output is correct
29 Correct 7 ms 8660 KB Output is correct
30 Correct 6 ms 6972 KB Output is correct
31 Correct 6 ms 6868 KB Output is correct
32 Correct 5 ms 6868 KB Output is correct
33 Correct 8 ms 8896 KB Output is correct
34 Correct 8 ms 8844 KB Output is correct
35 Correct 8 ms 8892 KB Output is correct
36 Correct 3 ms 5108 KB Output is correct
37 Correct 6 ms 6964 KB Output is correct
38 Correct 5 ms 6868 KB Output is correct
39 Correct 6 ms 6868 KB Output is correct
40 Correct 184 ms 86348 KB Output is correct
41 Correct 214 ms 76564 KB Output is correct
42 Correct 210 ms 66324 KB Output is correct
43 Correct 167 ms 64480 KB Output is correct
44 Correct 169 ms 68524 KB Output is correct
45 Correct 244 ms 93900 KB Output is correct
46 Correct 250 ms 91560 KB Output is correct
47 Correct 268 ms 93904 KB Output is correct
48 Correct 248 ms 93900 KB Output is correct
49 Correct 240 ms 93888 KB Output is correct
50 Correct 365 ms 102512 KB Output is correct
51 Correct 318 ms 103096 KB Output is correct
52 Correct 403 ms 102140 KB Output is correct
53 Correct 354 ms 94048 KB Output is correct
54 Correct 288 ms 93968 KB Output is correct
55 Correct 295 ms 94024 KB Output is correct
56 Correct 170 ms 93440 KB Output is correct
57 Correct 170 ms 93368 KB Output is correct
58 Correct 175 ms 93408 KB Output is correct
59 Correct 198 ms 93428 KB Output is correct
60 Correct 214 ms 93468 KB Output is correct
61 Correct 206 ms 93512 KB Output is correct
62 Correct 197 ms 93448 KB Output is correct
63 Correct 191 ms 91568 KB Output is correct
64 Correct 162 ms 93800 KB Output is correct
65 Correct 172 ms 93880 KB Output is correct
66 Correct 179 ms 93884 KB Output is correct
67 Correct 2 ms 5076 KB Output is correct
68 Correct 7 ms 8904 KB Output is correct
69 Correct 8 ms 8936 KB Output is correct
70 Correct 7 ms 8868 KB Output is correct
71 Correct 400 ms 118704 KB Output is correct
72 Correct 384 ms 100016 KB Output is correct
73 Correct 568 ms 146272 KB Output is correct
74 Correct 757 ms 165924 KB Output is correct
75 Correct 762 ms 165600 KB Output is correct
76 Correct 728 ms 165564 KB Output is correct
77 Correct 619 ms 165020 KB Output is correct
78 Correct 654 ms 165132 KB Output is correct
79 Correct 633 ms 164948 KB Output is correct
80 Correct 354 ms 165520 KB Output is correct
81 Correct 343 ms 165452 KB Output is correct
82 Correct 437 ms 165600 KB Output is correct
83 Correct 414 ms 165500 KB Output is correct
84 Correct 308 ms 145484 KB Output is correct
85 Correct 315 ms 130360 KB Output is correct
86 Correct 260 ms 95736 KB Output is correct
87 Correct 431 ms 156376 KB Output is correct
88 Correct 436 ms 156520 KB Output is correct
89 Correct 443 ms 156316 KB Output is correct
90 Correct 415 ms 156160 KB Output is correct
91 Correct 433 ms 156004 KB Output is correct
92 Correct 801 ms 161484 KB Output is correct
93 Correct 817 ms 163312 KB Output is correct
94 Correct 648 ms 155564 KB Output is correct
95 Correct 661 ms 155648 KB Output is correct
96 Correct 618 ms 155656 KB Output is correct
97 Correct 623 ms 155756 KB Output is correct
98 Correct 308 ms 155040 KB Output is correct
99 Correct 335 ms 155072 KB Output is correct
100 Correct 334 ms 154940 KB Output is correct
101 Correct 323 ms 154956 KB Output is correct
102 Correct 421 ms 155084 KB Output is correct
103 Correct 412 ms 155032 KB Output is correct
104 Correct 412 ms 155000 KB Output is correct
105 Correct 268 ms 155408 KB Output is correct
106 Correct 263 ms 155516 KB Output is correct
107 Correct 283 ms 155476 KB Output is correct
108 Correct 290 ms 155484 KB Output is correct