Alex_tz307

USACO 2020 February Contest, Silver Problem 2. Triangles

Dec 1st, 2020
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define pi pair<int,int>
  4. #define x first
  5. #define y second
  6.  
  7. using namespace std;
  8.  
  9. ifstream fin("triangles.in");
  10. ofstream fout("triangles.out");
  11.  
  12. const int MOD = 1e9 + 7,
  13.           XMAX = 2e4 + 1,
  14.           NMAX = 1e5 + 1;
  15. vector <pi> a, v[XMAX];
  16. vector <int> sum[NMAX];
  17.  
  18. void add_self(int &a, int b) {
  19.     a += b;
  20.     if(a >= MOD)
  21.         a -= MOD;
  22. }
  23.  
  24. void solve() {
  25.     for(int i = 0; i < XMAX; ++i)
  26.         if(!v[i].empty()) {
  27.             int N = v[i].size();
  28.             sort(v[i].begin(), v[i].end());
  29.             int curr = 0;
  30.             for(int j = 1; j < N; ++j)
  31.                 add_self(curr, v[i][j].x - v[i][0].x);
  32.             for(int j = 0; j < N; ++j) {
  33.                 if(j)
  34.                     add_self(curr, ((j << 1) - N) * (v[i][j].x - v[i][j - 1].x) % MOD);
  35.                 sum[v[i][j].y].emplace_back(curr);
  36.             }
  37.         }
  38. }
  39.  
  40. int32_t main() {
  41.     int N;
  42.     fin >> N;
  43.     a.resize(N);
  44.     for(int i = 0; i < N; ++i)
  45.         fin >> a[i].x >> a[i].y;
  46.     for(int i = 0; i < N; ++i)
  47.         v[a[i].x + 10000].emplace_back(a[i].y, i);
  48.     solve();
  49.     for(int i = 0; i < XMAX; ++i)
  50.         v[i].clear();
  51.     for(int i = 0; i < N; ++i)
  52.         v[a[i].y + 10000].emplace_back(a[i].x, i);
  53.     solve();
  54.     int ans = 0;
  55.     for(int i = 0; i < N; ++i)
  56.         add_self(ans, sum[i][0] * sum[i][1] % MOD);
  57.     fout << ans;
  58. }
  59.  
Advertisement
Add Comment
Please, Sign In to add comment