제출 #1009685

#제출 시각아이디문제언어결과실행 시간메모리
1009685NintsiChkhaidzeTwo Currencies (JOI23_currencies)C++17
100 / 100
2525 ms63436 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 L[N],R[N],S[N],T[N],X[N],Y[N],C[N],ans[N],total[N];
int timer,tin[N],tout[N],t[7][4*N],val[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 t[id][h] + get(id,right,idx);
    return t[id][h] + 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);
    }

    for (int i = 1; i <= q; i++){
        cin>>S[i]>>T[i]>>X[i]>>Y[i];
        L[i] = 0;
        R[i] = vec.size() - 1;
        C[i] = lca(S[i],T[i]);
        total[i] = get(3,1,1,n,tin[S[i]]) + get(3,1,1,n,tin[T[i]]) - 2*get(3,1,1,n,tin[C[i]]);
    }

    for (int j = 1; j <= 30; j++){
        clear(1,1,n);

        vector <pii> qr;
        for (int i = 1; i <= q; i++){
            int mid = (L[i] + R[i])/2;
            qr.pb({mid,i});
        }
        sort(qr.begin(),qr.end());

        int l = 0;
        for (int i = 0; i < qr.size(); i++){
            int id = qr[i].s,mid = qr[i].f;
            while (l <= mid){
                int x = B[vec[l].s];
                upd(1,1,1,n,tin[x],tout[x],vec[l].f);
                upd(2,1,1,n,tin[x],tout[x],1);
                ++l;
            }

            int sum = get(1,1,1,n,tin[S[id]]) + get(1,1,1,n,tin[T[id]]) - 2*get(1,1,1,n,tin[C[id]]);
            if (sum <= Y[id]){
                int cnt = get(2,1,1,n,tin[S[id]]) + get(2,1,1,n,tin[T[id]]) - 2*get(2,1,1,n,tin[C[id]]);
                ans[id] = cnt;
                L[id] = mid + 1;
            }else{
                R[id] = mid - 1;
            }   
        }
    }

    for (int i = 1; i <= q; i++){
        ans[i] = total[i] - ans[i];
        
        if (ans[i] <= X[i]) cout<<X[i] - ans[i]<<endl;
        else cout<<-1<<endl;
    }

}

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

currencies.cpp: In function 'int main()':
currencies.cpp:98: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]
   98 |     for (int i = 0;i < vec.size(); i++){
      |                    ~~^~~~~~~~~~~~
currencies.cpp:122: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]
  122 |         for (int i = 0; i < qr.size(); i++){
      |                         ~~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...