Submission #1179571

#TimeUsernameProblemLanguageResultExecution timeMemory
1179571pythontestConstruction Project 2 (JOI24_ho_t2)C++20
100 / 100
233 ms35024 KiB
#include <iostream> #include <vector> #include <queue> #include <algorithm> #include <unordered_map> using namespace std; constexpr int N=2e5+7; vector<pair<long long,int>> graf[N]; long long distfroms[N]; long long distfromt[N]; constexpr int MJ=20; long long tree[1<<MJ]; void rundikstra(int start, long long *tab){ priority_queue<pair<long long, int>> kolejka; kolejka.push({0,start}); while(!kolejka.empty()){ auto top = kolejka.top(); top.first=-top.first; kolejka.pop(); if(tab[top.second]<=top.first) continue; tab[top.second]=top.first; for(auto x:graf[top.second]){ long long nd = top.first+x.first; if(tab[x.second]>nd) kolejka.push({-nd,x.second}); } } } void update(int n, long long v){ n+=1<<(MJ-1); tree[n]+=v; n>>=1; while(n){ tree[n]=tree[2*n]+tree[2*n+1]; n>>=1; } } long long read(int a, int b){ a+=1<<(MJ-1); b+=1<<(MJ-1); long long res = tree[a]; if(a!=b) res+=tree[b]; while((a>>1)!=(b>>1)){ if(a%2==0) res+=tree[a+1]; if(b%2==1) res+=tree[b-1]; a>>=1; b>>=1; } return res; } unordered_map<long long, int> mapka; int main() { long long n,m; scanf("%lld %lld",&n,&m); int s,t; long long c,k; scanf("%d %d %lld %lld",&s,&t,&c,&k); for(int i=0;i<m;i++){ int a,b; long long c; scanf("%d %d %lld",&a,&b,&c); graf[a].push_back({c,b}); graf[b].push_back({c,a}); } for(int i=0;i<=n;i++) distfroms[i]=distfromt[i]=1e18; rundikstra(s,distfroms); rundikstra(t,distfromt); if(k>=distfroms[t]){ printf("%lld",(n*(n-1))/2); exit(0); } vector<pair<long long, int>> distvec; distvec.reserve(n); for(int i=1;i<=n;i++) distvec.push_back({distfroms[i],i}); sort(distvec.begin(),distvec.end()); vector<long long> przepisana; przepisana.reserve(n); for(int i=1;i<=n;i++) przepisana.push_back(distfromt[i]); sort(przepisana.begin(),przepisana.end()); for(int i=0;i<n;i++) mapka[przepisana[i]]=i+1; for(int i=0;i<n;i++) update(mapka[przepisana[i]],1); long long wyn=0; for(int i=0;i<n;i++){ update(mapka[distfromt[distvec[i].second]],-1); long long req = k-distvec[i].first-c+1; auto p = lower_bound(przepisana.begin(), przepisana.end(), req); int index = p-przepisana.begin(); if(index!=0){ wyn+=read(1,index); } } printf("%lld",wyn); return 0; }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:54:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   54 |     scanf("%lld %lld",&n,&m);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~
Main.cpp:57:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   57 |     scanf("%d %d %lld %lld",&s,&t,&c,&k);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:61:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   61 |         scanf("%d %d %lld",&a,&b,&c);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...