제출 #914916

#제출 시각아이디문제언어결과실행 시간메모리
914916ThylOneTwo Currencies (JOI23_currencies)C++14
10 / 100
653 ms175040 KiB
//####################
//TwoCurrencies
//####################
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxiN = 1000000;
const int LOG = 17;
vector<int> links[maxiN];
int depth[maxiN];
int up[maxiN][LOG];
void root(int node,int d=0,int parent=-1){
    up[node][0]=parent;
    depth[node]=d;
    for(int v:links[node])if(v!=parent){
        root(v,d+1,node);
    }
}
int getK(int node,int K){
    for(int i=LOG-1;i>=0;i--){
        if((K>>i)&1){
            node = up[node][i];
        }
    }
    return node;
}
int LCA(int a,int b){
    if(depth[b]>depth[a])swap(a,b);
    a = getK(a,depth[a]-depth[b]);
    if(a==b){
        return a;
    }
    for(int l = LOG-1;l>=0;l--){
        if(up[a][l]!=up[b][l]){
            a = up[a][l];
            b = up[b][l];
        }
    }
    return up[a][0];
}
map<int,vector<int>> peages;
vector<int> val[maxiN];
signed main(){
    fill(depth,depth+maxiN,-1);
    int n,m,q;cin>>n>>m>>q;
    vector<pair<int,int>> edges;
    for(int i = 0;i<n-1;i++){
        int a,b;cin>>a>>b;
        a--;b--;
        edges.push_back(make_pair(a,b));
        links[a].push_back(b);
        links[b].push_back(a);
    }
    root(0,0,-1);
    int C;
    for(int i = 0;i<m;i++){
        int p,c;cin>>p>>c;
        C=c;
        p--;
        auto a = edges[p].first;
        auto b = edges[p].second;
        if(depth[a]<depth[b])swap(a,b);
        peages[c].push_back(a);
        val[a].push_back(c);
    }
    //On calcule la tab de LCA
    for(int l=1;l<LOG;l++){
        for(int i = 0;i<n;i++){
            if(up[i][l-1]==-1){
                up[i][l]=-1;
            }
            up[i][l] = up[up[i][l-1]][l-1];
        }
    }
    for(int i = 0;i<q;i++){
        int a,b,x,y;cin>>a>>b>>x>>y;
        a--;b--;
        int lca = LCA(a,b);
        int ans = 0;
        if(lca==a){
            swap(a,b);
        }
        set<int> S;
        auto f = [&](int l){
            for(int j=l;j!=-1 && j!=lca;j=up[j][0])
                S.insert(j);
        };
        f(a);
        f(b);
        vector<int> vec;
        for(auto x:S){
            for(auto v:val[x]){
                vec.push_back(v);
            }
        }
        
        
        
        
        sort(vec.begin(),vec.end());
        int cnt=0;

        for(int j = 0;j<vec.size() && y>=vec[j];j++){
            y -= vec[j];
            cnt++;
        }
        if((vec.size()-cnt)>x){
            cout<<-1<<'\n';
        }else{
            cout<<x-(vec.size()-cnt)<<endl;
        }
        
        
        
    }

    return 0;
};

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

currencies.cpp: In function 'int main()':
currencies.cpp:103:24: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  103 |         for(int j = 0;j<vec.size() && y>=vec[j];j++){
      |                       ~^~~~~~~~~~~
currencies.cpp:107:28: warning: comparison of integer expressions of different signedness: 'long long unsigned int' and 'long long int' [-Wsign-compare]
  107 |         if((vec.size()-cnt)>x){
      |            ~~~~~~~~~~~~~~~~^~
currencies.cpp:79:13: warning: unused variable 'ans' [-Wunused-variable]
   79 |         int ans = 0;
      |             ^~~
currencies.cpp:55:9: warning: variable 'C' set but not used [-Wunused-but-set-variable]
   55 |     int C;
      |         ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...