Submission #1164126

#TimeUsernameProblemLanguageResultExecution timeMemory
1164126WH8Construction Project 2 (JOI24_ho_t2)C++20
100 / 100
185 ms28056 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;
#define g0(x) get<0>(x)
#define g1(x) get<1>(x)
#define g2(x) get<2>(x)

#define pb push_back
#define int long long 
#define f first
#define s second
#define pll pair<long long, long long>
vector<vector<pll>> al(200005);
int n,m,s,t,l,k;
//~ int fw[200005];
int pitr[200005];
vector<pll> dists(200005,{LLONG_MAX, LLONG_MAX}), distt(200005, {LLONG_MAX, LLONG_MAX});
//~ void upd(int x, int v){
	//~ if(x==0)assert(false);
	//~ while(x<=n){
		//~ fw[x]+=v;
		//~ x+=(x&-x);
	//~ }
//~ }
//~ int qry(int x){
	//~ int ret=0;
	//~ while(x>0){
		//~ ret+=fw[x];
		//~ x-=(x&-x);
	//~ }
	//~ return ret;
//~ }

void dijkstra(int x, vector<pll> & dist){
	//~ for(int i=1; i<=n;i++)dist[i].f=1e16, dist[i].s=i;
	//~ dist[x].f=0;
	//~ queue<int> q;
	//~ q.push(x);
	//~ while(!q.empty()){
		//~ int c=q.front();
		//~ q.pop();
		//~ cout<<c<<endl;
		//~ for(auto it:al[c]){
			//~ if(dist[it.f].f>dist[c].f+1){
				//~ dist[it.f].f=dist[c].f+1;
				//~ q.push(it.f);
			//~ }
		//~ }
	//~ }
	for(int i=1; i<=n;i++)dist[i].f=1e16, dist[i].s=i;
	dist[x].f=0;
	priority_queue<pll,vector<pll>,greater<pll>> pq;
	pq.push({0, x});
	while(!pq.empty()){
		auto [d,c]=pq.top();
		//~ printf("at %lld \n", c);
		pq.pop();
		if(dist[c].f<d)continue;
		for(auto [u, v]:al[c]){
			if(dist[u].f<=d+v)continue;
			dist[u].f=d+v;
			pq.push({dist[u].f,u});
		}
	}
}

signed main(){
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin>>n>>m>>s>>t>>l>>k;
	
	for(int i=0;i<m;i++){
		int a,b,c;cin>>a>>b>>c;
		al[a].pb({b,c});
		al[b].pb({a,c});
	}
	dijkstra(s, dists);
	dijkstra(t, distt);
	if(dists[t].f <= k){
		cout<<(n*(n-1))/2;
		return 0;
	}
	sort(dists.begin(), dists.end());
	sort(distt.begin(),distt.end());
	for(int i=0;i<n;i++){
		pitr[distt[i].s]=i+1;
	}
	//~ for(int i=0;i<n;i++){
		//~ cout<<dists[i].f<<" "<<dists[i].s<<" |";
	//~ }cout<<endl;
	//~ for(int i=0;i<n;i++){
		//~ cout<<distt[i].f<<" "<<distt[i].s<<" |";
	//~ }cout<<endl;
	//~ for(int i=1;i<=n;i++){
		//~ cout<<pitr[i]<<" ";
	//~ }cout<<endl;
	int ans=0, cur=0, ptr=0;
	bool tcov[n+1]; fill(tcov, tcov+n+1, false);
	bool scov[n+1]; fill(scov, scov+n+1, false);

	for(int i=n-1;i>=0;i--){
		while(ptr<n and distt[ptr].f + dists[i].f + l <= k){
			tcov[distt[ptr].s]=1;
			if(!scov[distt[ptr].s])cur++;
			ptr++;
		}
		scov[dists[i].s]=1;
		if(tcov[dists[i].s])cur++;
		//~ printf("i %lld, ptr %lld, cur %lld\n", i, ptr, cur);
		ans+=max(0ll, ptr-cur);
	}
	cout<<ans;
}

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