fork(1) download
  1. #include <cstdio>
  2. #include <deque>
  3. #include <algorithm>
  4. #include <climits>
  5. #include <sys/time.h>
  6. using namespace std;
  7.  
  8. typedef unsigned int u32;
  9. typedef unsigned long long u64;
  10. static_assert(sizeof(u32)==4 && sizeof(u64)==8, "Fail");
  11.  
  12. struct A {
  13. u32 first, second;
  14. A(int f, int s):first(f),second(s) {}
  15. bool operator<(u32 b) const { return first < b; }
  16. };
  17. //bool operator<(const A&a, u32 b) { return a.first < b; }
  18.  
  19. struct B {
  20. u64 v;
  21. B(int f, int s) { v = ((u64)f << 32) | s; }
  22. bool operator<(u32 b) const {
  23. return (v >> 32) < b;
  24. }
  25. };
  26. u32 get_value(deque<A>& d, u32 v) {
  27. auto p = lower_bound(d.begin(), d.end(), v);
  28. if (p != d.end())
  29. return p->second;
  30. else
  31. return UINT_MAX;
  32. }
  33. u32 get_value(deque<B>& d, u32 v) {
  34. auto p = lower_bound(d.begin(), d.end(), v);
  35. if (p != d.end())
  36. return p->v & 0xFFFFFFFF;
  37. else
  38. return UINT_MAX;
  39. }
  40.  
  41. int main(int argc, char **argv)
  42. {
  43. {
  44. deque<A> d;
  45. struct timeval s, e;
  46. gettimeofday(&s, 0);
  47. for (int i = 0; i < 1024LL * 1024 * 1024 * 3 / 32; ++i)
  48. d.emplace_back(A(i, i ^ 92142));
  49. long v = 0;
  50. for (int i = 0; i < 10000; ++i)
  51. v += get_value(d, i * 3 + 1);
  52.  
  53. gettimeofday(&e, 0);
  54. auto sec = e.tv_sec - s.tv_sec;
  55. auto usc = e.tv_usec - s.tv_usec;
  56. printf("A %ld\n", v);
  57. printf("Time: %lu\n", sec * 1000 + usc / 1000);
  58. }
  59. {
  60. deque<B> d;
  61. struct timeval s, e;
  62. gettimeofday(&s, 0);
  63. for (int i = 0; i < 1024LL * 1024 * 1024 * 3 / 32; ++i)
  64. d.emplace_back(B(i, i ^ 92142));
  65. long v = 0;
  66. for (int i = 0; i < 10000; ++i)
  67. v += get_value(d, i * 3 + 1);
  68.  
  69. gettimeofday(&e, 0);
  70. auto sec = e.tv_sec - s.tv_sec;
  71. auto usc = e.tv_usec - s.tv_usec;
  72. printf("B %ld\n", v);
  73. printf("Time: %lu\n", sec * 1000 + usc / 1000);
  74. }
  75. }
  76.  
Success #stdin #stdout 2.51s 3460KB
stdin
Standard input is empty
stdout
A 828349112
Time: 993
B 828349112
Time: 1085