제출 #1262112

#제출 시각아이디문제언어결과실행 시간메모리
1262112tdkhaiConstruction Project 2 (JOI24_ho_t2)C++20
100 / 100
602 ms37384 KiB
#include<bits/stdc++.h>
#define ll long long
#define ii pair<int,int>
#define llll pair<ll,ll>
#define pb push_back
#define fi first
#define se second
#define tdk "metro"
#define int long long
using namespace std;
const ll INF =1e18;
const int N=2e5+5;
vector<ii> a[N];
ll d[3][N],k,ans,ft[4*N],ft2[4*N];
int n,m,s,t,L;
vector<ll> vec;
void dijkstra(int id,int beg)
{
    for(int i=1;i<=n;i++) d[id][i]=INF;
    d[id][beg]=0;
    priority_queue<llll,vector<llll>,greater<llll>> pq;
    pq.push({0,beg});
    while(pq.size())
    {
        ll w=pq.top().fi;
        int u=pq.top().se;
        pq.pop();
        if(d[id][u]!=w)
            continue;
        for(int i=0;i<a[u].size();i++)
        {
            int v=a[u][i].fi,c=a[u][i].se;
            if(d[id][v]>d[id][u]+c)
            {
                d[id][v]=d[id][u]+c;
                pq.push({d[id][v],v});
            }
        }
    }
}
void update(int u)
{
    while(u<=vec.size())
    {
        ft[u]++;
        u+=(u&(-u));
    }
}
ll get(int u)
{
    ll ret=0;
    while(u)
    {
        ret+=ft[u];
        u-=(u&(-u));
    }
    return ret;
}
void update2(int u,int val)
{
    while(u)
    {
        ft2[u]+=val;
        u-=(u&(-u));
    }
}
ll get2(int u)
{
    ll ret=0;
    while(u<=vec.size())
    {
        ret+=ft2[u];
        u+=(u&(-u));
    }
    return ret;
}
void solve()
{
    cin >>n >> m >> s >> t >> L >> k;
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        cin>> u >> v >> w;
        a[u].pb({v,w});
        a[v].pb({u,w});
    }
    dijkstra(1,s);
    dijkstra(2,t);
    if(d[1][t]<=k)
    {
        cout << (n*(n-1))/2;
        return;
    }
    if(L>k and d[1][t]>k)
    {
        cout <<0;return;
    }
    if(n<=5e3)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                ll mn=d[1][t];//    cout << ans << ":\n";

                if(d[1][i]+d[2][j]+L<=k or d[2][i]+d[1][j]+L<=k)
                {
//                    cout << i << ' ' << j << '\n';
                    ans++;
                }
            }
        }
        cout << ans;
        return;
    }
    for(int t=1;t<=2;t++)
    {
        for(int i=1;i<=n;i++)
        {
//            cnt[t][d[t][i]]++;
            vec.pb(d[t][i]);
            vec.pb(k-d[t][i]-L);
//            cout << t << ' ' << i << ' ' << d[t][i] << '\n';
        }
    }
    sort(vec.begin(),vec.end());
    vec.erase(unique(vec.begin(),vec.end()),vec.end());
    for(int i=1;i<=n;i++)
    {
        int l=0,r=vec.size()-1,ok=0;
//        cout << k << ' ' << d[2][i] << ' ' <<L << ":::" << k-d[2][i]-L << ' ';
        ll cur=k-d[2][i]-L;
//        cout << d[1][i] << ' ' << d[2][i] << ' ';
        while(l<=r)
        {
            int mid=l+r>>1;
            if(vec[mid]<=cur)
            {
                l=mid+1;
                ok=vec[mid];
            }
            else
            {
                r=mid-1;
            }
        }
        ok=lower_bound(vec.begin(),vec.end(),ok)-vec.begin()+1;
//        cout << i << ' ' << get(ok) << ' ' << ok << ' ' << cur  << '\n';
        ans+=get(ok);
//        cout << ans << '\n';
        cur=lower_bound(vec.begin(),vec.end(),d[1][i])-vec.begin()+1;
//        cout << cur << '\n';
        update(cur);
    }
//    cout << ans << ":\n";
    for(int i=1;i<=vec.size();i++) ft[i]=0;
    for(int i=1;i<=n;i++)
    {
        int ok=lower_bound(vec.begin(),vec.end(),k-d[2][i]-L)-vec.begin()+1;
        update2(ok,1);
    }
    for(int i=1;i<=n;i++)
    {
        int l=0,r=vec.size()-1,ok=0;
//        cout << k << ' ' << d[2][i] << ' ' <<L << ":::" << k-d[2][i]-L << ' ';
        ll cur=k-d[1][i]-L;
//        cout << d[1][i] << ' ' << d[2][i] << ' ';
        while(l<=r)
        {
            int mid=l+r>>1;
            if(vec[mid]<=cur)
            {
                l=mid+1;
                ok=vec[mid];
            }
            else
            {
                r=mid-1;
            }
        }
        ok=lower_bound(vec.begin(),vec.end(),ok)-vec.begin()+1;
//        cout << i << ' ' << get(ok) << ' ' << ok << ' ' << cur  << '\n';
        ans+=get(ok);
//        ok=lower_bound(vec.begin(),vec.end(),k-d[2][i]-L)-vec.begin()+1;
//        update2(ok,-1);
//        ok=lower_bound(vec.begin(),vec.end(),d[1][i])-vec.begin()+1;
//        ans-=get2(ok);
        cur=lower_bound(vec.begin(),vec.end(),d[2][i])-vec.begin()+1;
//        cout << ans <<'\n';
//        cout << cur << '\n';
        update(cur);
    }
    cout << ans;
}
signed main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    // freopen(tdk".inp","r",stdin);
    // freopen(tdk".out","w",stdout);
    int t=1;//cin >> t;
    while(t--)
    {
        solve();
    }
    cerr <<"\n\n\ Time elapsed: " << 1024.0*clock()/CLOCKS_PER_SEC << "mb ans:" << ans <<'\n';
    return 0;
}


컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'int main()':
Main.cpp:205:12: warning: unknown escape sequence: '\040'
  205 |     cerr <<"\n\n\ Time elapsed: " << 1024.0*clock()/CLOCKS_PER_SEC << "mb ans:" << 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...