Guest User

USACO 2020 Gold Problem 3

a guest
Dec 24th, 2020
549
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.77 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. #define sz(v) (int)v.size()
  6. #define ar array
  7. const int MAXN=2e2+10, INF=1e9+10;
  8.  
  9. ll r(){
  10. return ll(rand()&INT_MAX)*INT_MAX+rand();
  11. }
  12.  
  13. ll el[MAXN];
  14.  
  15. struct hsh {
  16. ll a=0;
  17. int s=0;
  18. void ad(int c){
  19. a ^= el[c]; s++;
  20. }
  21. void er(int c){
  22. ad(c); s--;
  23. }
  24. ll get(){
  25. return a;
  26. }
  27. int size(){
  28. return s;
  29. }
  30. };
  31.  
  32. int n;
  33. ar<ll, 3> a[MAXN];
  34.  
  35.  
  36. int main(){
  37. ios::sync_with_stdio(false); cin.tie(0);
  38. cin >> n; srand(123);
  39. for (int i = 0; i < n; i++) cin >> a[i][0] >> a[i][1], a[i][2] = i;
  40. for (int i = 0; i < n; i++) el[i] = r();
  41.  
  42. unordered_set<ll> al;
  43.  
  44. auto solve = [&](){
  45. vector<pair<ll, int>> c;
  46. sort(a, a+n);
  47.  
  48. auto get = [&](ll lo, ll hi, ll len){
  49. sort(c.begin(), c.end());
  50. int l=lower_bound(c.begin(), c.end(), make_pair(lo, -1))-c.begin(), r=upper_bound(c.begin(), c.end(), make_pair(hi, INF))-c.begin();
  51. hsh s;
  52. for (int i = l, j = i; i < r; i++){
  53. while (j < sz(c) && c[j].first-c[i].first <= len) {
  54. if (c[j].second != -1) s.ad(c[j].second);
  55. j++;
  56. }
  57. if (s.size() > 1) al.insert(s.get());
  58.  
  59. if (c[i].second != -1){
  60. s.er(c[i].second);
  61. }
  62. }
  63. };
  64. for (int i = 0; i < n; i++) for (int j = i+1; j < n; j++){
  65. ll len=a[j][0]-a[i][0], lo=max(a[i][1], a[j][1])-len, hi=min(a[i][1], a[j][1]);
  66. if (lo > hi) continue;
  67. assert(len >= 0);
  68. c.clear();
  69. for (int k = i; k <= j; k++) c.emplace_back(a[k][1], a[k][2]), c.emplace_back(a[k][1]-len, -1), c.emplace_back(a[k][1]-len+1, -1), c.emplace_back(a[k][1]-len-1, -1);
  70. get(lo, hi, len);
  71. }
  72. };
  73.  
  74. for (int rep = 0; rep < 2; rep++){
  75. solve();
  76. for (int i = 0; i < n; i++) swap(a[i][0], a[i][1]);
  77. }
  78. cout << (n+1+sz(al)) << '\n';
  79. }
Advertisement
Add Comment
Please, Sign In to add comment