Advertisement
Guest User

Untitled

a guest
Jan 24th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.24 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define pb push_back
  4. #define ll long long
  5. #define F first
  6. #define S second
  7. #define rand rnd
  8.  
  9. using namespace std;
  10.  
  11. mt19937 rnd;
  12.  
  13. ll solve(int n, int p, vector <pair<int, int>> vvod) {
  14. ll inf = 1e18;
  15. int mod = 1e9 + 7;
  16. set <pair <int,int>> st;
  17. map <pair <int,int>, int> mp;
  18. vector <int> cnt(n);
  19. for (int i = 0; i < n; i++) {
  20. int x = vvod[i].F;
  21. int y = vvod[i].S;
  22. cnt[x]++;
  23. cnt[y]++;
  24. if (x > y) swap(x, y);
  25. st.insert({x, y});
  26. mp[ {x, y}]++;
  27. }
  28. int extra = 0;
  29. for (auto x : st) {
  30. if (cnt[x.F] + cnt[x.S] - mp[ {x.F, x.S}] >= p) continue;
  31. if (cnt[x.F] + cnt[x.S] >= p) extra++;
  32. }
  33. ll ans = 0;
  34. sort(cnt.rbegin(),cnt.rend());
  35. for (int i = 0; i < n; i++) {
  36. if (cnt[i] < p / 2) break;
  37. int l = i + 1, r = n - 1, j = 0;
  38. while (l <= r) {
  39. int mid = (l + r)/2;
  40. if (cnt[mid] + cnt[i] >= p) {
  41. l = mid + 1;
  42. j = mid;
  43. } else r = mid - 1;
  44. }
  45. j = min(j, n - 1);
  46. ans += max(0, j - i);
  47. }
  48. return ans - extra;
  49. }
  50.  
  51. ll wa6(int n, int p, vector <pair<int, int>> vvod) {
  52. ll inf = 1e18;
  53. int mod = 1e9 + 7;
  54. set <pair <int,int>> st;
  55. map <pair <int,int>, int> mp;
  56. vector <int> cnt(n);
  57. for (int i = 0; i < n; i++) {
  58. int x = vvod[i].F;
  59. int y = vvod[i].S;
  60. cnt[x]++;
  61. cnt[y]++;
  62. if (x > y) swap(x, y);
  63. st.insert({x, y});
  64. mp[ {x, y}]++;
  65. }
  66. ll ans = 0;
  67. sort(cnt.rbegin(),cnt.rend());
  68. for (int i = 0; i < n; i++) {
  69. if (cnt[i] < p / 2) break;
  70. int l = i + 1, r = n - 1, j = 0;
  71. while (l <= r) {
  72. int mid = (l + r)/2;
  73. if (cnt[mid] + cnt[i] >= p) {
  74. l = mid + 1;
  75. j = mid;
  76. } else r = mid - 1;
  77. }
  78. j = min(j, n - 1);
  79. ans += max(0, j - i);
  80. }
  81. return ans;
  82. }
  83.  
  84. ll wa13(int n, int p, vector <pair<int, int>> vvod) {
  85. ll inf = 1e18;
  86. int mod = 1e9 + 7;
  87. set <pair <int,int>> st;
  88. map <pair <int,int>, int> mp;
  89. vector <int> cnt(n);
  90. for (int i = 0; i < n; i++) {
  91. int x = vvod[i].F;
  92. int y = vvod[i].S;
  93. cnt[x]++;
  94. cnt[y]++;
  95. st.insert({x, y});
  96. mp[{x, y}]++;
  97. }
  98. int extra = 0;
  99. for (auto x : st) {
  100. if (cnt[x.F] + cnt[x.S] - mp[ {x.F, x.S}] >= p) continue;
  101. if (cnt[x.F] + cnt[x.S] >= p) extra++;
  102. }
  103. ll ans = 0;
  104. sort(cnt.rbegin(),cnt.rend());
  105. for (int i = 0; i < n; i++) {
  106. if (cnt[i] < p / 2) break;
  107. int l = i + 1, r = n - 1, j = 0;
  108. while (l <= r) {
  109. int mid = (l + r)/2;
  110. if (cnt[mid] + cnt[i] >= p) {
  111. l = mid + 1;
  112. j = mid;
  113. } else r = mid - 1;
  114. }
  115. j = min(j, n - 1);
  116. ans += max(0, j - i);
  117. }
  118. return ans - extra;
  119. }
  120.  
  121. int main() {
  122. ios_base::sync_with_stdio(0);
  123. cin.tie(0);
  124. cout.tie(0);
  125. #ifdef LOCAL
  126. freopen("input.txt", "r", stdin);
  127. freopen("output.txt", "w", stdout);
  128. #endif //LOCAL
  129. ll cnt = 0;
  130. rnd.seed(time(0));
  131. int N = 3e5;
  132. while (true) {
  133. int n = rnd() % (N - 100000) + 100000;
  134. int k = rnd() % 15;
  135. int kek = rnd() % 500 + 19500;
  136. vector <pair<int, int>> v(n, {-1, -1});
  137. for (int i = 0; i < n; i++) {
  138. int x = rnd() % kek;
  139. while (x == i) x = rand() % kek;
  140. int y = rnd() % kek;
  141. while (y == i || y == x) y = rand() % kek;
  142. v[i].F = x;
  143. v[i].S = y;
  144. if (rnd() % 3) swap(v[i].F, v[i].S);
  145. }
  146. ll ok = solve(n, k, v);
  147. ll wa1 = wa6(n, k, v);
  148. ll wa2 = wa13(n, k, v);
  149. if (ok != wa2) {
  150. cout << n << ' ' << k << endl;
  151. for (int i = 0; i < n; i++) {
  152. cout << v[i].F + 1 << ' ' << v[i].S + 1 << endl;
  153. }
  154. cout << kek << endl;
  155. return 0;
  156. }
  157. if (cnt % 100 == 0) {
  158. cerr << n << ' ' << k << ' ' << kek << ' ' << cnt << endl;
  159. }
  160. cnt++;
  161. }
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement