Submission #3712764


Source Code Expand

#include <bits/stdc++.h>
#define FOR(i, begin, end) for(int i=(begin);i<(end);i++)
#define REP(i, n) FOR(i,0,n)
#define IFOR(i, begin, end) for(int i=(end)-1;i>=(begin);i--)
#define IREP(i, n) IFOR(i,0,n)
#define SORT(a) sort(a.begin(), a.end())
#define REVERSE(a) reverse(a.begin(), a.end())
#define Lower_bound(v, x) distance(v.begin(), lower_bound(v.begin(), v.end(), x))
#define Upper_bound(v, x) distance(v.begin(), upper_bound(v.begin(), v.end(), x))
#define int long long
#define INF 1000000000000000000
using namespace std;

#define ANS(f) if(f) cout << "YES" << endl; else cout << "NO" << endl;

typedef vector<int> vec;
typedef vector<vec> mat;
typedef pair<int, int> Pii;

template<typename T>
void readv(vector<T> &a){ REP(i, a.size()) cin >> a[i]; }
void readi(vector<int> &a){ REP(i, a.size()){cin >> a[i]; a[i]--;} }
void debug(mat m){REP(i, m.size()){ REP(j, m[0].size()){ cout << m[i][j] << ","; } cout << endl; }}

struct edge{int to, cost;};

class Graph
{
public:
    int V;
    vector<vector<edge>> G;
    vec d;

    Graph(int V): V(V){
        G = vector<vector<edge>>(V, vector<edge>(0));
        d = vec(V);
    }

    void add_edge(int from, int to, int cost){
        G[from].push_back(edge({to, cost}));
    }

    void add_edge2(int v1, int v2, int cost){
        add_edge(v1, v2, cost);
        add_edge(v2, v1, cost);
    }

    void dijkstra(int s, int t){
        priority_queue<Pii, vector<Pii>, greater<Pii>> que;
        fill(d.begin(), d.end(), INF);
        d[s] = 0;
        que.push(Pii(0, s));

        while(!que.empty()){
            Pii p = que.top(); que.pop();
            int v = p.second;
            if(v == t) return;
            if(d[v] < p.first) continue;
            REP(i, G[v].size()){
                edge e = G[v][i];
                if(d[e.to] > d[v] + e.cost){
                    d[e.to] = d[v] + e.cost;
                    que.push(Pii(d[e.to], e.to));
                }
            }
        }
    }

};

signed main(){

    int N, M, R, T; cin >> N >> M >> R >> T;
    Graph G(N);
    vec a(M), b(M), c(M);
    REP(i, M){
        cin >> a[i] >> b[i] >> c[i];
        a[i]--; b[i]--;
        G.add_edge2(a[i], b[i], c[i]);
    }
    int ans = 0;
    REP(A, N){
        G.dijkstra(A, -1);
        SORT(G.d);
        FOR(B, 1, N){
            int D = (G.d[B] * T - 1) / R;
            if(D < G.d[B]) ans += Upper_bound(G.d, D) - 1;
            else ans += Upper_bound(G.d, D) - 2;
        }
    }
    cout << ans << endl;

    return 0;
}

Submission Info

Submission Time
Task C - ウサギとカメ
User sumitacchan
Language C++14 (GCC 5.4.1)
Score 100
Code Size 2593 Byte
Status AC
Exec Time 1161 ms
Memory 640 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 2
AC × 18
Set Name Test Cases
Sample subtask0_sample-01.txt, subtask0_sample-02.txt
All subtask0_sample-01.txt, subtask0_sample-02.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt
Case Name Status Exec Time Memory
subtask0_sample-01.txt AC 1 ms 256 KB
subtask0_sample-02.txt AC 1 ms 256 KB
subtask1_01.txt AC 1 ms 256 KB
subtask1_02.txt AC 1 ms 256 KB
subtask1_03.txt AC 1 ms 256 KB
subtask1_04.txt AC 1 ms 256 KB
subtask1_05.txt AC 6 ms 256 KB
subtask1_06.txt AC 9 ms 256 KB
subtask1_07.txt AC 31 ms 512 KB
subtask1_08.txt AC 39 ms 512 KB
subtask1_09.txt AC 334 ms 512 KB
subtask1_10.txt AC 320 ms 384 KB
subtask1_11.txt AC 139 ms 512 KB
subtask1_12.txt AC 1075 ms 512 KB
subtask1_13.txt AC 1063 ms 512 KB
subtask1_14.txt AC 1149 ms 640 KB
subtask1_15.txt AC 768 ms 512 KB
subtask1_16.txt AC 1161 ms 640 KB