Submission #1203285

#TimeUsernameProblemLanguageResultExecution timeMemory
1203285AlgorithmWarriorConstruction Project 2 (JOI24_ho_t2)C++20
100 / 100
216 ms24848 KiB
#include <bits/stdc++.h>

using namespace std;

int const MAX=200005;
int n,m,s,t,l;
long long k;

struct edge{
    int nod;
    long long len;
};

vector<edge>G[MAX];

void read(){
    cin>>n>>m>>s>>t>>l>>k;
    int i;
    for(i=1;i<=m;++i){
        int a,b,len;
        cin>>a>>b>>len;
        G[a].push_back({b,len});
        G[b].push_back({a,len});
    }
}

class cmp{
public:
    bool operator()(edge a,edge b){
        return a.len>b.len;
    }
};

long long distS[MAX];
long long distT[MAX];

void djikstra(int nod,long long dist[]){
    priority_queue<edge,vector<edge>,cmp>pq;
    fill(dist,dist+MAX,1e18);
    dist[nod]=0;
    pq.push({nod,0});
    while(!pq.empty()){
        int nod_curr=pq.top().nod;
        long long len_curr=pq.top().len;
        pq.pop();

        if(len_curr>dist[nod_curr]){
            continue;
        }

        for(auto vec : G[nod_curr]){
            int nod_nou=vec.nod;
            long long len_nou=vec.len;
            if(dist[nod_nou]>len_curr+len_nou){
                dist[nod_nou]=len_curr+len_nou;
                pq.push({nod_nou,dist[nod_nou]});
            }
        }
    }
}

int get_pos(long long v[],int sz,long long nr){
    /// pos ult el <= nr
    /// [ )
    int st=1,dr=sz+1;
    while(dr-st>1){
        int mij=(st+dr)/2;
        if(v[mij]<=nr){
            st=mij;
        }
        else{
            dr=mij;
        }
    }
    return st;
}

long long dS[MAX],dT[MAX];

long long solve(){
    djikstra(s,distS);
    djikstra(t,distT);

    if(distS[t]<=k){
        return 1LL*n*(n-1)/2;
    }

    int i;
    for(i=1;i<=n;++i){
        dS[i]=distS[i];
        dT[i]=distT[i];
    }

    sort(dS+1,dS+n+1);
    sort(dT+1,dT+n+1);

    long long rez=0;

    for(i=1;i<=n;++i){
        long long val=k-l-distS[i];
        if(val>=0){
            rez+=get_pos(dT,n,val);
        }
    }

    return rez;
}

void write(){
    cout<<solve();
}

int main()
{
    read();
    write();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...