제출 #124438

#제출 시각아이디문제언어결과실행 시간메모리
124438forelax통행료 (IOI18_highway)C++14
51 / 100
439 ms29396 KiB
#include "highway.h"
#include<bits/stdc++.h>
using namespace std;
/*
int N,M,A,B,S,T;
vector<int> U,V;
vector<vector<pair<int,int> > > NG;
long long int ask(vector<int> W){
    queue<pair<long long int,int> > q;
    q.push({0,S});
    vector<long long int> dst(N,1e16);
    dst[S]=0;
    while(q.size()){
        pair<int,int> cur=q.front();
        long long int d=-cur.first;
        long long int nd=cur.second;
        q.pop();
        for(int i = 0 ; i < NG[nd].size() ; i ++){
            int ne=NG[nd][i].first;
            int ew=NG[nd][i].second;
            ew=W[ew]*(B-A)+A;
            if(d+ew<dst[ne]){
                dst[ne]=d+ew;
                q.push({-dst[ne],ne});
            }
        }
    }
    return dst[T];
}
void answer(int A,int B){
    cout<<A<<" "<<B<<endl;
}*/




int n,m,a,b,s,t;
long long int minpr,maxpr,tmp;
vector<int> u,v,ord,w,d;
vector<vector<pair<long long int,int> > > ng;
vector<vector<int> > bfs(int st,int ed){
    vector<vector<int> > rz(n,{n+1,0,0});
    rz[st]={0,ed,st};
    priority_queue<vector<int> > q;
    q.push({rz[st]});
    while(q.size()){
        vector<int> cr=q.top();
        q.pop();
        int cn=cr[2];
        int cd=-cr[0];
        for(int i = 0 ; i < ng[cn].size() ; i ++ ){
            int ne=ng[cn][i].first;
            int en=ng[cn][i].second;
            if(rz[ne][0]>cd+1){
                rz[ne]={-cd-1,en,ne};
                q.push(rz[ne]);
                rz[ne][0]*=-1;
            }
        }
    }
    return rz;
}
int fnd(vector<vector<int> > s0){
    w.clear();
    w.resize(m,1);
    for(int i = 0 ; i < s0.size() ; i ++){
        w[s0[i][1]]=0;
    }
    long long int q=ask(w);
    int l=0,r=s0.size();
    while(l!=r-1){
        int md=(l+r)/2;
        w.clear();
        w.resize(m,1);
        for(int i = 0 ; i < md ; i ++)
            w[s0[i][1]]=0;
        tmp=ask(w);
        if(tmp==q){
            r=md;
        }else{
            l=md;
        }
    }
    return s0[l][2];
}
void find_pair(int N, vector<int> U, vector<int> V, int A, int B) {
    u=U;v=V;n=N;
    m=u.size();
    ng.resize(n);
    for(int i = 0 ; i < m ; i ++){
        ng[u[i]].push_back({v[i],i});
        ng[v[i]].push_back({u[i],i});
    }
    w.resize(m);
    minpr=ask(w);
    maxpr=minpr/A*B;
    int l=0,r=m;
    while(l!=r-1){
        int md=(l+r)/2;
        for(int i = 0 ; i < m ; i ++){
            if(i<md)
                w[i]=1;
            else
                w[i]=0;
        }
        tmp=ask(w);
        if(tmp==minpr){
            l=md;
        }else{
            r=md;
        }
    }
    vector<vector<int> > g1=bfs(u[l],l);
    vector<vector<int> > g2=bfs(v[l],l);
    vector<vector<int> > s1,s2;
    for(int i = 0 ; i < n ; i ++){
        if(g1[i][0]<g2[i][0]){
            s1.push_back(g1[i]);
        }else if(g2[i][0]<g1[i][0]){
            s2.push_back(g2[i]);
        }
    }
    sort(s1.begin(),s1.end());
    sort(s2.begin(),s2.end());
    t=fnd(s1);
    s=fnd(s2);
    answer(s,t);
}
/*
int main(){
    cin>>N>>M>>A>>B>>S>>T;
    U.resize(M);
    V.resize(M);
    NG.resize(N);
    for(int i = 0 ; i < M ; i ++){
        cin>>U[i]>>V[i];
        NG[U[i]].push_back({V[i],i});
        NG[V[i]].push_back({U[i],i});
    }
    find_pair(N,U,V,A,B);
}
*/

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

highway.cpp: In function 'std::vector<std::vector<int> > bfs(int, int)':
highway.cpp:51:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i = 0 ; i < ng[cn].size() ; i ++ ){
                         ~~^~~~~~~~~~~~~~~
highway.cpp: In function 'int fnd(std::vector<std::vector<int> >)':
highway.cpp:66:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0 ; i < s0.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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...