제출 #1148481

#제출 시각아이디문제언어결과실행 시간메모리
1148481Cookie197Construction Project 2 (JOI24_ho_t2)C++20
100 / 100
715 ms97628 KiB
// Cookie197 // i am absolute trash //#pragma GCC optimize("O4,unroll-loops,no-stack-protector") //#pragma GCC optimize("Ofast") //#pragma GCC target("avx,avx2,fma") #include<iostream> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<string> #include<iomanip> #include<math.h> #include<unordered_map> #include <cassert> #include<random> using namespace std; #define i_am_trashQ_Q ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); #define ll long long #define pii pair<ll,ll> #define mp make_pair #define mod 998244353 //#define mod 1000000007 #define endl "\n" #define inf (ll)1e18 #define out(x) cout << #x << " = " << x <<endl #define out2(a,b) cout<< #a << "[" << b << "]" << " = " << a[b] << endl; #define outp(x) cout << #x << " first = " << x.first << " second = " << x.second << endl ll n,m,s,t; ll L,K,ds[200005],dt[200005]; vector<pii> adj[200005]; vector<pii> P,Q; set<ll> all; map<ll,ll> tosmall; int tobig[600005]; bool sort_ds(pii a,pii b){ return a.first < b.first; } bool sort_dt(pii a,pii b){ return a.second < b.second; } ll bit[600005]; void update(int id,int x){ for (int i=id;i<=600002;i+=(i&-i)){ bit[i] += x; } } int sum(int k){ if (k <= 0) return 0; int ans = 0; for (int i=k;i>0;i-=(i&-i)){ ans += bit[i]; } return ans; } signed main(){ i_am_trashQ_Q; cin>>n>>m; cin>>s>>t>>L>>K; for (int i=1;i<=m;i++){ ll a,b,c; cin>>a>>b>>c; adj[a].push_back(mp(b,c)); adj[b].push_back(mp(a,c)); } for (int i=1;i<=n;i++) ds[i] = dt[i] = 1e18; priority_queue<pii,vector<pii>,greater<pii> > pq; pq.push(mp(0,s)); while(!pq.empty()){ int now=pq.top().second; ll dis=pq.top().first; pq.pop(); if(ds[now] != 1e18)continue; ds[now] = dis; for (pii p:adj[now]){ if (ds[p.first] != 1e18) continue; pq.push(mp(dis+p.second,p.first)); } } pq.push(mp(0,t)); while(!pq.empty()){ int now=pq.top().second; ll dis=pq.top().first; pq.pop(); if(dt[now] != 1e18)continue; dt[now] = dis; for (pii p:adj[now]){ if (dt[p.first] != 1e18) continue; pq.push(mp(dis+p.second,p.first)); } } if (ds[t] <= K) {cout<<n*(n-1)/2<<endl; return 0;} //n = 7; K = 24; L = 0; //ds[1] = 5; ds[2] = 7; ds[3] = 10; ds[4] = 13; ds[5] = 14; ds[6] = 16; ds[7] = 19; //dt[1] = 10; dt[2] = 8; dt[3] = 16; dt[4] = 9; dt[5] = 8; dt[6] = 15; dt[7] = 9; for (int i=1;i<=n;i++) P.push_back(mp(ds[i], dt[i])), Q.push_back(mp(ds[i], dt[i])), all.insert(ds[i]), all.insert(dt[i]), all.insert(K-L+1-dt[i]); sort(P.begin(), P.end(), sort_ds); sort(Q.begin(), Q.end(), sort_dt); //for (int i=0;i<n;i++) cout<<Q[i].first<<" "<<Q[i].second<<endl; int cnt = 0; for (ll u:all) cnt++, tosmall[u] = cnt, tobig[cnt] = u; //for (int i=1;i<=cnt;i++) out2(tobig, i); ll bad_pairs = 0; int r = n; for (int i=0;i<n;i++){ while(r >= 1){ if (P[i].first + Q[r-1].second >= K-L+1){ r--; update(tosmall[Q[r].first], 1); //out(Q[r].first); }else break; } ll x = 0; if (P[i].second >= K-L+1) x = sum(600002); else x = sum(600002) - sum(tosmall[K-L+1-P[i].second] - 1); //out(x); bad_pairs += x; } for (int i=1;i<=n;i++) if (ds[i] + dt[i] >= K-L+1) bad_pairs--; cout<<n*(n-1)/2 - bad_pairs/2<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...