제출 #917077

#제출 시각아이디문제언어결과실행 시간메모리
917077manizareTwo Currencies (JOI23_currencies)C++14
100 / 100
3055 ms68568 KiB
#include<bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")


#define pb push_back
#define F first
#define S second 
#define all(a) a.begin(),a.end()
#define pii pair <int,int>
#define int long long
#define sz(v) (int)v.size()
#define rep(i , a , b) for(int i=a;i <= (b);i++)
#define per(i , a , b) for(int i=a;i >= (b);i--)
#define deb(x) cerr<<#x << " : " << x << "\n"; 

using namespace std ;   
const int maxn = 1e5 + 10 ,  mod = 1e9 + 7 , inf =1e9 , lg = 19  ;
int fen[maxn],par[maxn][lg+1],dis[maxn],pai[maxn],l[maxn],r[maxn],x[maxn],y[maxn],V[maxn],U[maxn],st[maxn],en[maxn];
int cnt=1, n , m , q,ans[maxn];
vector <int> vec[maxn] ;
vector <pii> ed, G[maxn];

void upd(int x, int w){
    while(x<=n){
        fen[x] += w; 
        x+=x&-x;
    }
}
int que(int v){
    int ans =0 ;
    while(v){
        ans += fen[v] ;
        v-=v&-v ;
    }
    return ans ;
}
int up(int v ,int d){
    rep(i ,0,lg)if(d>>i&1)v= par[v][i] ;
    return v ;
}
int lca(int v,int u){
    if(dis[v] < dis[u])swap(v,u);
    v=up(v,dis[v]-dis[u]);
    per(i , lg ,0 ){
        if(par[v][i]!=par[u][i])v = par[v][i] , u = par[u][i] ;
    }
    if(v==u)return v;
    return par[v][0] ;
}

void d1(int v, int p =0){
    par[v][0] = p; 
    rep(i , 1,lg){
        par[v][i] = par[par[v][i-1]][i-1] ;
    }
    st[v] = cnt ;cnt++;
    for(pii u : G[v]){
        if(u.F == p)continue ;
        pai[u.S] = u.F ;
        dis[u.F] = dis[v]+1 ;
        d1(u.F , v) ;
    }
    en[v] = cnt-1 ;
}


signed main(){
    ios::sync_with_stdio(0) ;cin.tie(0);
     cin >> n >> m >> q; 
    rep(i , 1 , n-1){
        int v,u ;
        cin >> v >> u ;
        G[v].pb({u ,i});
        G[u].pb({v,i}) ;
    }
    d1(1); 
    rep(i , 1, m){
        int id , w ;
        cin >> id >> w ;
        ed.pb({w,id}) ;
    }    
    sort(all(ed));
    rep(i , 1, q){
        cin >> V[i] >> U[i] >> x[i] >> y[i] ;
        l[i] = -1 ;
        r[i] =sz(ed) ;
    }
    rep(i , 0 , lg){
        rep(i , 1,q){
            vec[(l[i]+r[i])/2].pb(i);
        }
        rep(i , 0 , sz(ed)-1){
            int v =pai[ed[i].S] , w = ed[i].F ;
            upd(st[v] , w);upd(en[v]+1,-w);
            for(int id : vec[i]){
                if(que(st[V[id]]) + que(st[U[id]]) - 2*que(st[lca(V[id] , U[id])]) <= y[id]){
                    l[id] = i ;
                }else{
                    r[id] = i ;
                }
            }
        }
        rep(j , 0 , max(n , sz(ed))){
            fen[j] =0 ;
            vec[j].clear() ;
        }
    }
    rep(i , 1 , q){
        vec[l[i]+1].pb(i) ;
    }
    per(i , sz(ed) , 0){
        for(int id : vec[i]){
            ans[id] = que(st[V[id]]) + que(st[U[id]]) - 2*que(st[lca(V[id] , U[id])]) ;
        }
        if(i ==0 )continue ;
        int v=pai[ed[i-1].S] , w = ed[i-1].F ;
        upd(st[v] , 1) ; upd(en[v]+1, -1) ;
    }
    rep(i , 1, q){
        if(ans[i] > x[i]){
            cout << "-1\n";
        }else{
            cout << x[i]-ans[i] << "\n"; 
        }
    }
}

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

currencies.cpp: In function 'int main()':
currencies.cpp:116:32: warning: unused variable 'w' [-Wunused-variable]
  116 |         int v=pai[ed[i-1].S] , w = ed[i-1].F ;
      |                                ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...