제출 #1028399

#제출 시각아이디문제언어결과실행 시간메모리
1028399peraTwo Currencies (JOI23_currencies)C++17
0 / 100
18 ms38748 KiB
#include<bits/stdc++.h> #define int long long using namespace std; const int N = 1e5 + 1 , LOG = 22; int n , m , q , e = 0; vector<int> LCA(N) , bound(N) , t(N) , D(N) , o(N) , U(N) , V(N) , ans(N) , L(N) , R(N) , P(N) , C(N) , S(N) , T(N) , X(N) , Y(N) , in(N) , out(N) , d(N); vector<vector<int>> g(N) , up(N , vector<int>(LOG)); vector<int> order = {0}; void upd(int u , int x){ while(u <= n){ t[u] += x; o[u] += (x > 0 ? 1 : -1); u += u&-u; } } int GET(int u){ int sum = 0; while(u > 0){ sum += t[u]; u -= u&-u; } return sum; } int get(int u){ int sum = 0; while(u > 0){ sum += o[u]; u -= u&-u; } return sum; } void dfs(int u , int p = 1){ in[u] = ++e; up[u][0] = p; d[u] = d[p] + 1; for(int x = 0;x < (int)g[u].size();x ++){ if(g[u][x] != p){ dfs(g[u][x] , u); } } out[u] = e; } void DFS(int u , int p = 1){ D[u] += D[p]; for(int x = 0;x < (int)g[u].size();x ++){ if(g[u][x] != p){ DFS(g[u][x] , u); } } } int lca(int u , int v){ if(d[u] < d[v]){ swap(u , v); } int s = d[u] - d[v]; for(int bit = 0;bit < LOG;bit ++){ if(s >> bit & 1){ u = up[u][bit]; } } if(u == v){ return u; } for(int bit = LOG - 1;bit >= 0;bit --){ if(up[u][bit] != up[v][bit]){ u = up[u][bit]; v = up[v][bit]; } } return up[u][0]; } main(){ cin >> n >> m >> q; for(int i = 1;i < n;i ++){ cin >> U[i] >> V[i]; g[U[i]].push_back(V[i]); g[V[i]].push_back(U[i]); } for(int i = 1;i <= m;i ++){ cin >> P[i] >> C[i]; } for(int i = 1;i <= q;i ++){ cin >> S[i] >> T[i] >> X[i] >> Y[i]; L[i] = 1 , R[i] = m; ans[i] = -1; } dfs(1); for(int i = 1;i <= m;i ++){ if(d[U[i]] < d[V[i]]){ swap(U[i] , V[i]); } ++D[U[i]]; } DFS(1); for(int bit = 1;bit < LOG;bit ++){ for(int u = 1;u <= n;u ++){ up[u][bit] = up[up[u][bit - 1]][bit - 1]; } } for(int i = 1;i <= q;i ++){ LCA[i] = lca(S[i] , T[i]); ans[i] = X[i] - (D[S[i]] + D[T[i]] - 2 * D[LCA[i]]); } for(int i = 1;i <= m;i ++){ order.push_back(i); } sort(order.begin() + 1 , order.end() , [&](int x , int y){ return C[x] < C[y]; }); for(int bit = LOG - 1;bit >= 0;bit --){ vector<vector<int>> query(n + 1); for(int i = 1;i <= q;i ++){ if(bound[i] + (1 << bit) <= m){ query[bound[i] + (1 << bit)].push_back(i); } } vector<int>(n + 1).swap(t); vector<int>(n + 1).swap(o); for(int i = 1;i <= m;i ++){ int v = U[P[order[i]]]; upd(in[v] , C[order[i]]); upd(out[v] + 1 , -C[order[i]]); for(int id : query[i]){ int silver_cost = GET(in[S[id]]) + GET(in[T[id]]) - 2 * GET(in[LCA[id]]); int gold_cost = get(in[S[id]]) + get(in[T[id]]) - 2 * get(in[LCA[id]]); if(silver_cost <= Y[id]){ bound[id] = i; ans[id] = X[id] - (D[S[id]] + D[T[id]] - 2 * D[LCA[id]] - gold_cost); } } } } for(int i = 1;i <= q;i ++){ cout << max(ans[i] , -1LL) << endl; } }

컴파일 시 표준 에러 (stderr) 메시지

currencies.cpp:72:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   72 | main(){
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...