Submission #1179590

#TimeUsernameProblemLanguageResultExecution timeMemory
1179590Szymon_PilipczukConstruction Project 2 (JOI24_ho_t2)C++20
100 / 100
506 ms53460 KiB
#include <bits/stdc++.h>
using namespace std;
long long inf = 1e18;
long long dis[2][200000];
vector<vector<vector<long long>>> gr;
priority_queue<vector<long long>> pq;
void dk(long long c,long long p,long long t)
{
    for(int i = 0;i<gr[p].size();i++)
    {
        if(dis[t][gr[p][i][0]] > c + gr[p][i][1])
        {
            dis[t][gr[p][i][0]] = c + gr[p][i][1];
            pq.push({(c + gr[p][i][1])*-1,gr[p][i][0],t});
        }
    }
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    long long n,m;
    cin>>n>>m;
    gr.resize(n);
    for(int i = 0;i<n;i++)
    {
        dis[0][i] = inf;
        dis[1][i] = inf;
    }
    long long s,t,xx;
    long long k;
    cin>>s>>t>>xx>>k;
    s--;t--;
    for(int i = 0;i<m;i++)
    {
        long long a,b,d;
        cin>>a>>b>>d;
        a--;b--;
        gr[a].push_back({b,d});
        gr[b].push_back({a,d});
    }
    dis[0][s] = 0;
    dis[1][t] = 0;
    pq.push({0,s,0});
    pq.push({0,t,1});
    while(!pq.empty())
    {
        long long a = pq.top()[0]*-1;
        long long b = pq.top()[1];
        long long c = pq.top()[2];
        pq.pop();
        if(dis[c][b] >= a)
        {
            dk(a,b,c);
        }
    }
    if(dis[0][t] <= k)
    {
        cout<<((long long)n*(n-1))/2<<"\n";
        return 0;
    }
    vector<long long> ct(n);
    for(int i = 0;i<n;i++)
    {
        ct[i] = dis[1][i];
        //cout<<dis[1][i]<<" "<<i<<" "<<ct[i]<<"\n";
    }
    sort(ct.begin(),ct.end());
    reverse(ct.begin(),ct.end());
    vector<long long> cs(n);
    for(int i = 0;i<n;i++)
    {
        cs[i]  =dis[0][i];
    }
    sort(cs.begin(),cs.end());
    long long ans = 0;
    long long j = 0;
    for(int i = 0;i<n;i++)
    {
        while(j != n && ct[j]+cs[i]+xx>k)
        {
            j++;
        }
        //cout<<ct[j]<<" "<<cs[i]<<" "<<xx<<" "<<k<<" "<<j<<" "<<n <<"\n";
        ans+=n-j;
    }
    cout<<ans<<"\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...