util.hpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #ifndef MY_H_G
  2. #define MY_H_G
  3. #include <chrono>
  4. #include <cmath>
  5. #include <cassert>
  6. #include <string>
  7. #include <cstring>
  8. #include <random>
  9. #include <algorithm>
  10. #include <iostream>
  11. #include <pcg_random.hpp>
  12. #include <fstream>
  13. #include <iomanip>
  14. #include <vector>
  15. #include <stack>
  16. #include <set>
  17. #include <list>
  18. #include <deque>
  19. #include <queue>
  20. #include <complex>
  21. #include <map>
  22. #include <unordered_map>
  23. #include <atomic>
  24. #include <limits>
  25. #include <thread>
  26. namespace std{
  27. inline unsigned long long nanoTime(){
  28. return std::chrono::high_resolution_clock::now().time_since_epoch().count();
  29. }
  30. }
  31. static pcg64_fast h_gen(std::nanoTime());
  32. static std::uniform_int_distribution<unsigned long long> h_dis_ulong(std::numeric_limits<unsigned long long>::min(),std::numeric_limits<unsigned long long>::max());
  33. static std::uniform_int_distribution<unsigned int> h_dis_uint(std::numeric_limits<unsigned int>::min(),std::numeric_limits<unsigned int>::max());
  34. static std::uniform_real_distribution<double> h_dis_double(0.0,1.0);
  35. template<typename T>
  36. inline std::ostream& operator<<(std::ostream& o,const std::vector<T>& vec){
  37. o << "[";
  38. for(unsigned int i = 0;i < vec.size();i++){
  39. o << vec[i];
  40. if(i < vec.size() - 1)o << ", ";
  41. }
  42. o << "]";
  43. return o;
  44. }
  45. template<>
  46. inline std::ostream& operator<<<char>(std::ostream& o,const std::vector<char>& vec){
  47. o << "[";
  48. for(unsigned int i = 0;i < vec.size();i++){
  49. o << (int)vec[i];
  50. if(i < vec.size() - 1)o << ", ";
  51. }
  52. o << "]";
  53. return o;
  54. }
  55. namespace std{
  56. inline double random(){
  57. return h_dis_double(h_gen);
  58. }
  59. template<typename T>
  60. inline T random(){
  61. return (T)0;
  62. }
  63. template<>
  64. inline double random<double>(){
  65. return h_dis_double(h_gen);
  66. }
  67. template<>
  68. inline unsigned long long random<unsigned long long>(){
  69. return h_dis_ulong(h_gen);
  70. }
  71. template<>
  72. inline unsigned int random<unsigned int>() {
  73. return h_dis_uint(h_gen);
  74. }
  75. }
  76. #endif