제출 #1009676

#제출 시각아이디문제언어결과실행 시간메모리
1009676NintsiChkhaidzeTwo Currencies (JOI23_currencies)C++17
0 / 100
2 ms10844 KiB
#include <bits/stdc++.h> #define ll long long #define pb push_back #define s second #define f first #define pii pair <int,int> #define left h*2,l,(l + r)/2 #define right h*2+1,(l + r)/2 + 1,r #define int ll using namespace std; const int N = 1e5 + 3,inf = 1e18; int A[N],B[N],dep[N],d[25][N]; int timer,tin[N],tout[N],t[7][4*N]; vector <int> v[N]; void dfs(int x,int par){ d[0][x] = par; tin[x] = ++timer; dep[x] = dep[par] + 1; for (int to: v[x]){ if (to != par) dfs(to,x); } tout[x] = timer; } int lca(int x,int y){ if (dep[x] < dep[y]) swap(x,y); for (int i = 20; i >= 0; i--) if (dep[d[i][x]] >= dep[y]) x= d[i][x]; if (x==y) return x; for (int i=20;i>=0;i--) if (d[i][x] != d[i][y]) { x = d[i][x]; y = d[i][y]; } return d[0][x]; } void upd(int id,int h,int l,int r,int L,int R,int val){ if (r < L || R < l) return; if (L <= l && r <= R){ t[id][h] += val; return; } upd(id,left,L,R,val); upd(id,right,L,R,val); } int get(int id,int h,int l,int r,int idx){ if (l == r) return t[id][h]; if (idx > (l + r)/2) return get(id,right,idx); return get(id,left,idx); } void clear(int h,int l,int r){ t[1][h] = t[2][h] = 0; if (l == r) return; clear(left); clear(right); } signed main (){ ios_base::sync_with_stdio(0),cin.tie(NULL),cout.tie(NULL); int n,m,q; cin>>n>>m>>q; for (int i = 1; i < n; i++){ cin >> A[i] >> B[i]; v[A[i]].pb(B[i]); v[B[i]].pb(A[i]); } dfs(1,1); for (int j = 1; j <= 20; j++) for (int i = 1; i <= n; i++) d[j][i] = d[j - 1][d[j - 1][i]]; vector <pii> vec; for (int i = 1; i <= m; i++){ int x,y; cin>>x>>y; vec.pb({y,x}); } sort(vec.begin(),vec.end()); for (int i= 1; i < n; i++){ if (dep[A[i]] > dep[B[i]]) swap(A[i],B[i]); } for (int i = 0;i < vec.size(); i++){ int x = B[vec[i].s]; upd(3,1,1,n,tin[x],tout[x],+1); } //neli for (int i = 1; i <= q; i++){ int s,t,x,y; cin>>s>>t>>x>>y; int c = lca(s,t); int total = get(3,1,1,n,tin[s]) + get(3,1,1,n,tin[t]) - 2*get(3,1,1,n,tin[c]); int ans = total; clear(1,1,n); for (int j = 0; j < vec.size(); j++){ int x = B[vec[j].s]; upd(1,1,1,n,tin[x],tout[x],vec[j].f); upd(2,1,1,n,tin[x],tout[x],1); int sum = get(1,1,1,n,tin[s]) + get(1,1,1,n,tin[t]) - 2*get(1,1,1,n,tin[c]); if (sum <= y){ int cnt = get(2,1,1,n,tin[s]) + get(2,1,1,n,tin[t]) - 2*get(2,1,1,n,tin[c]); ans = total - cnt; }else{ break; } } if (ans <= x) cout<<x - ans<<endl; else cout<<-1<<endl; } }

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

currencies.cpp: In function 'int main()':
currencies.cpp:97:22: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   97 |     for (int i = 0;i < vec.size(); i++){
      |                    ~~^~~~~~~~~~~~
currencies.cpp:112:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |         for (int j = 0; j < vec.size(); j++){
      |                         ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...