Submission #183615
Source Code Expand
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <sys/time.h>
#include <unordered_map>
#include <unordered_set>
#include <unistd.h>
#include <utility>
#include <vector>
using namespace std;
#define i64 int64_t
#define rep(i, n) for(i64 i = 0; i < ((i64)(n)); ++i)
#define sz(v) ((i64)((v).size()))
#define bit(n) (((i64)1)<<((i64)(n)))
#define all(v) (v).begin(), (v).end()
template <int POS, class TUPLE> void deploy(std::ostream &os, const TUPLE &tuple){}
template <int POS, class TUPLE, class H, class ...Ts> void deploy(std::ostream &os, const TUPLE &t){ os << (POS == 0 ? "" : ", ") << get<POS>(t); deploy<POS + 1, TUPLE, Ts...>(os, t); }
template <class ...Ts> std::ostream& operator<<(std::ostream &os, const std::tuple<Ts...> &t){ os << "("; deploy<0, std::tuple<Ts...>, Ts...>(os, t); os << ")"; return os; }
template <class T> std::ostream& operator<<(std::ostream &os, std::vector<T> &v){ int remain = v.size(); os << "{"; for(auto e: v) os << e << (--remain == 0 ? "" : ", "); os << "}"; return os; }
template <class T> std::ostream& operator<<(std::ostream &os, std::set<T> &v){ int remain = v.size(); os << "{"; for(auto e: v) os << e << (--remain == 0 ? "" : ", "); os << "}"; return os; }
template <class T> std::ostream& operator<<(std::ostream &os, std::queue<T> &q){ auto qq = q; os << "{"; for(; !qq.empty(); qq.pop()){ os << qq.front() << (qq.size() != 1 ? ", " : ""); } os << "}"; return os; }
template <class T> std::ostream& operator<<(std::ostream &os, std::priority_queue<T> &q){ auto qq = q; os << "{"; for(; !qq.empty(); qq.pop()){ os << qq.top() << (qq.size() != 1 ? ", " : ""); } os << "}"; return os; }
template <class T, class K> std::ostream& operator<<(std::ostream &os, std::pair<T, K> &p){ os << "(" << p.first << ", " << p.second << ")"; return os; }
template <class T, class K> std::ostream& operator<<(std::ostream &os, std::map<T, K> &mp){ int remain = mp.size(); os << "{"; for(auto e: mp) os << "(" << e.first << " -> " << e.second << ")" << (--remain == 0 ? "" : ", "); os << "}"; return os; }
template <class T, class K> std::ostream& operator<<(std::ostream &os, std::unordered_map<T, K> &mp){ int remain = mp.size(); os << "{"; for(auto e: mp) os << "(" << e.first << " -> " << e.second << ")" << (--remain == 0 ? "" : ", "); os << "}"; return os; }
#define DEBUG0() { char buf[100]; sprintf(buf, "line:%3d | ", __LINE__); std::cout << buf << std::endl; }
#define DEBUG1(var0) { char buf[100]; sprintf(buf, "line:%3d | ", __LINE__); std::cout << buf << (#var0) << "=" << (var0) << std::endl; }
#define DEBUG2(var0, var1) { char buf[100]; sprintf(buf, "line:%3d | ", __LINE__); std::cout << buf << (#var0) << "=" << (var0) << ", " << (#var1) << "=" << (var1) << std::endl; }
#define DEBUG3(var0, var1, var2) { char buf[100]; sprintf(buf, "line:%3d | ", __LINE__); std::cout << buf << (#var0) << "=" << (var0) << ", " << (#var1) << "=" << (var1) << ", " << (#var2) << "=" << (var2) << std::endl; }
#define DEBUG4(var0, var1, var2, var3) { char buf[100]; sprintf(buf, "line:%3d | ", __LINE__); std::cout << buf << (#var0) << "=" << (var0) << ", " << (#var1) << "=" << (var1) << ", " << (#var2) << "=" << (var2) << ", " << (#var3) << "=" << (var3) << std::endl; }
#define DEBUG5(var0, var1, var2, var3, var4) { char buf[100]; sprintf(buf, "line:%3d | ", __LINE__); std::cout << buf << (#var0) << "=" << (var0) << ", " << (#var1) << "=" << (var1) << ", " << (#var2) << "=" << (var2) << ", " << (#var3) << "=" << (var3) << ", " << (#var4) << "=" << (var4) << std::endl; }
#define DEBUG6(var0, var1, var2, var3, var4, var5) { char buf[100]; sprintf(buf, "line:%3d | ", __LINE__); std::cout << buf << (#var0) << "=" << (var0) << ", " << (#var1) << "=" << (var1) << ", " << (#var2) << "=" << (var2) << ", " << (#var3) << "=" << (var3) << ", " << (#var4) << "=" << (var4) << ", " << (#var5) << "=" << (var5) << std::endl; }
#define ASSERT(f) { if(!(f)){ DEBUG1("error"); while(true); }}
template <typename T> class Dijkstra
{
public:
void addEdge(int from, int dest, T cost);
void update(int source);
T getDistance(int vertex);
~Dijkstra();
Dijkstra(int vertex_num);
private:
const int vertex_num;
T *distances;
class Edge
{
public:
int target;
T distance;
Edge(int target, T distance) : target(target), distance(distance) {}
};
std::vector<Edge> *edges;
class QueueElement
{
public:
T distance;
int vertex;
inline QueueElement(T distance, int vertex) : distance(distance), vertex(vertex){}
inline bool operator>(const QueueElement &e)const{ return distance > e.distance; }
};
};
template <typename T>
inline Dijkstra<T>::~Dijkstra()
{
delete [] edges;
delete [] distances;
}
template <typename T>
inline Dijkstra<T>::Dijkstra(int vertex_num) : vertex_num(vertex_num)
{
edges = new vector<Edge>[vertex_num];
distances = new T[vertex_num];
}
template <typename T>
inline T Dijkstra<T>::getDistance(int vertex)
{
return distances[vertex];
}
template <typename T>
inline void Dijkstra<T>::update(int source)
{
memset(distances, -1, sizeof(T) * vertex_num);
priority_queue<QueueElement, vector<QueueElement>, greater<QueueElement> > q;
distances[source] = 0;
q.push(QueueElement(0, source));
for(int total_size = 1; 0 < total_size; q.pop()){
int vertex = q.top().vertex;
T distance = q.top().distance;
if(distances[vertex] < distance) continue;
--total_size;
for(auto e : edges[vertex]){
int next_vertex = e.target;
T next_distance = e.distance + distance;
if(distances[next_vertex] == -1){
++total_size;
distances[next_vertex] = next_distance;
q.push(QueueElement(next_distance, next_vertex));
}else if(next_distance < distances[next_vertex]){
distances[next_vertex] = next_distance;
q.push(QueueElement(next_distance, next_vertex));
}
}
}
}
template <typename T>
inline void Dijkstra<T>::addEdge(int from, int dest, T cost)
{
edges[from].push_back(Edge(dest, cost));
}
int main()
{
i64 n, m, r, t;
cin >> n >> m >> r >> t;
Dijkstra<i64> dijkstra(n);
rep(i, m){
i64 a, b, c;
cin >> a >> b >> c; --a, --b;
dijkstra.addEdge(a, b, c);
dijkstra.addEdge(b, a, c);
}
i64 total = 0;
rep(target, n){
dijkstra.update(target);
vector<i64> a;
rep(i, n)if(target != i) a.push_back(dijkstra.getDistance(i));
sort(all(a));
i64 cur = 0;
rep(i, sz(a)){
while(cur < sz(a) && a[cur] * t <= a[i] * r) ++cur;
total += sz(a) - cur - (cur <= i ? 1 : 0);
}
}
cout << total << endl;
}
Submission Info
Submission Time |
|
Task |
C - ウサギとカメ |
User |
Komaki |
Language |
C++11 (GCC 4.8.1) |
Score |
100 |
Code Size |
6986 Byte |
Status |
AC |
Exec Time |
1222 ms |
Memory |
1176 KB |
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
100 / 100 |
Status |
|
|
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 |
110 ms |
804 KB |
subtask0_sample-02.txt |
AC |
24 ms |
908 KB |
subtask1_01.txt |
AC |
23 ms |
848 KB |
subtask1_02.txt |
AC |
25 ms |
860 KB |
subtask1_03.txt |
AC |
23 ms |
920 KB |
subtask1_04.txt |
AC |
53 ms |
788 KB |
subtask1_05.txt |
AC |
31 ms |
880 KB |
subtask1_06.txt |
AC |
33 ms |
884 KB |
subtask1_07.txt |
AC |
55 ms |
1016 KB |
subtask1_08.txt |
AC |
64 ms |
1012 KB |
subtask1_09.txt |
AC |
380 ms |
924 KB |
subtask1_10.txt |
AC |
350 ms |
976 KB |
subtask1_11.txt |
AC |
169 ms |
1052 KB |
subtask1_12.txt |
AC |
1070 ms |
1100 KB |
subtask1_13.txt |
AC |
1074 ms |
1056 KB |
subtask1_14.txt |
AC |
1222 ms |
1044 KB |
subtask1_15.txt |
AC |
812 ms |
1132 KB |
subtask1_16.txt |
AC |
1194 ms |
1176 KB |