Submission #1262499

#TimeUsernameProblemLanguageResultExecution timeMemory
1262499maithedungConstruction Project 2 (JOI24_ho_t2)C++20
100 / 100
286 ms51612 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define fast ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define exit return 0
#define cap pair<int,int>
#define fi first
#define se second
#define pb push_back
#define FOR(i,l,r) for(int i=l;i<=r;i++)
#define FOD(i,r,l) for(int i=r;i>=l;i--)
#define fill(f,x) memset(f,x,sizeof(f))
#define lcm(a,b) (a/__gcd(a,b)*b)
#define TIME 1.0 * clock() / CLOCKS_PER_SEC
#define iii pair<cap,int>
#define low_bit(x) (x&(-x))
int A[1000005];
int B[1000005];
int n;
int s,t,k,l;
vector<cap> ke[1000005];
int m;
iii C[1000005];
cap A2[1000005];
cap B2[1000005];
int fw[1000005];
int cd[1000005];
void update(int pos, int val)
{
    for(int i=pos;i<=n;i+=low_bit(i)) fw[i]+=val;
}

int get(int pos)
{
    int sum=0;
    for(int i=pos;i>0;i-=low_bit(i)) sum+=fw[i];
    return sum;
}

int query(int l, int r)
{
    return get(r)-get(l-1);
}
void dijk(int s, int visited[])
{
    priority_queue<cap,vector<cap>,greater<cap>> q;
    FOR(i,1,n) visited[i]=1e18;
    q.push({0,s});
    visited[s]=0;
    while(!q.empty())
    {
        int u=q.top().second;
        int cost=q.top().first;
        q.pop();
        if(cost>visited[u]) continue;
        for(auto it: ke[u])
        {
            int v=it.first;
            int cost2=it.second;
            if(visited[v]>visited[u]+cost2)
            {
                visited[v]=visited[u]+cost2;
                q.push({visited[v],v});
            }
        }
    }
}

bool cmp(iii a, iii b)
{
    return a.first.second<b.first.second;
}
signed main()
{
    fast;
    cin>>n>>m;
    cin>>s>>t>>l>>k;
    FOR(i,1,m)
    {
        int x,y,w;
        cin>>x>>y>>w;
        ke[x].push_back({y,w});
        ke[y].push_back({x,w});
    }
    dijk(s,A);
    dijk(t,B);
    int dem=0;
    if(A[t]<=k)
    {
        cout<<n*(n-1)/2;
        return 0;
    }
    FOR(i,1,n)
    {
        C[i].first.first=A[i];
        C[i].first.second=B[i];
        C[i].second=i;
        A2[i].first=A[i];
        A2[i].second=i;
        B2[i].first=B[i];
        B2[i].second=i;
    }
    sort(C+1,C+1+n,cmp);
    sort(A2+1,A2+1+n,greater<cap>());
    sort(B2+1,B2+1+n);
    FOR(i,1,n)
    {
        cd[C[i].second]=i;
    }
    int j=0;
//    FOR(i,1,n)
//    {
//        FOR(j,i+1,n)
//        {
//            if(min(C[i].first.first+C[j].first.second+l,C[j].first.first+C[i].first.second+l)<=k)
//            {
//                cout<<i<<" "<<j<<endl;
//            }
//        }
//    }
//    FOR(i,1,n) cout<<C[i].first.first<<" ";
//    cout<<endl;
//    FOR(i,1,n) cout<<C[i].first.second<<" ";
  //  cout<<dem<<endl;
    FOR(i,1,n)
    {
        int pos=A2[i].second;
        int val=A2[i].first;
        while(j<n && B2[j+1].first+val<=k-l)
        {
            j+=1;
            update(cd[B2[j].second],1);
        }
        int pos_new=cd[pos];
        val=C[pos_new].first.first;
        int left=1;
        int right=n;
        int ans=-1;
        while(left<=right)
        {
            int mid=(left+right)>>1;
            if(C[mid].first.second+val<=k-l)
            {
                ans=mid;
                left=mid+1;
            }
            else right=mid-1;
        }
        int tmp=query(1,n);
        if(ans!=-1)
        {
            tmp+=ans-query(1,ans);
        }
        dem+=tmp;
    }
    cout<<dem;
    exit;
}
/*
░▒▓███████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░ ░▒▓██████▓▒░
░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░
░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒▒▓███▓▒░
░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
░▒▓███████▓▒░ ░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░░▒▓██████▓▒░


*/


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...