Dang_Quan_10_Tin

Ô chết tra (A Thanh)

Jan 29th, 2021
327
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.92 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. using ld = long double;
  5. using ull = unsigned long long;
  6.  
  7. const bool typetest = 0;
  8. const int N = 3e3 + 5;
  9. int m, n, q;
  10. int k, a[N][N];
  11. int b[N], pos[N], last[N];
  12. vector<int> adj[N];
  13.  
  14. void Read()
  15. {
  16.     cin >> m >> n >> q >> k;
  17.     for (int i = 1; i <= q; ++i)
  18.     {
  19.         int u, v;
  20.         cin >> u >> v;
  21.         ++a[u][v];
  22.         adj[u].push_back(v);
  23.     }
  24.     for (int i = 1; i <= n; ++i)
  25.         for (int j = 1; j <= m; ++j)
  26.             a[j][i] += a[j - 1][i];
  27. }
  28.  
  29. void Solve()
  30. {
  31.     ll ans(0);
  32.     for (int i = 1; i <= m; ++i)
  33.     {
  34.         vector<int> s;
  35.         s.push_back(0);
  36.         int p(0);
  37.         b[n + 1] = 11;
  38.         ll cur(0);
  39.         for (int j = 1; j <= n; ++j)
  40.         {
  41.             b[j] = a[m][j] - a[i - 1][j];
  42.             if (b[j] != 0)
  43.             {
  44.                 s.push_back(j);
  45.                 pos[j] = s.size() - 1;
  46.                 cur += 1ll * (s[pos[j]] - s[pos[j] - 1]) * (s[pos[j]] - s[pos[j] - 1] - 1) / 2;
  47.                 ++p;
  48.             }
  49.         }
  50.         cur += 1ll * (n + 1 - s.back()) * (n + 1 - s.back() - 1) / 2;
  51.         s.push_back(n + 1);
  52.         for (int j = 1, t = 1, sum(0); j <= p; ++j)
  53.         {
  54.             sum -= b[s[j - 1]];
  55.             t = max(t, j);
  56.             while (t <= p && sum + b[s[t]] < k)
  57.             {
  58.                 sum += b[s[t]];
  59.                 ++t;
  60.             }
  61.             last[s[j]] = s[t];
  62.             cur += 1ll * (s[j] - s[j - 1]) * (s[t] - s[j]);
  63.         }
  64.         //cout << i << ":\n";
  65.         int t = m;
  66.         do
  67.         {
  68.             //cerr << t << "\n";
  69.             ans += cur;
  70.             for (auto j : adj[t])
  71.             {
  72.                 int h = pos[j], sum(0), x;
  73.                 --b[j];
  74.                 while (h >= 1 && sum + b[s[h]] < k)
  75.                 {
  76.                     sum += b[s[h]];
  77.                     --h;
  78.                 }
  79.                 if (h != pos[j])
  80.                     ++h;
  81.                 for (x = h, sum = 0; h <= p; ++h)
  82.                 {
  83.                     sum -= b[s[h - 1]];
  84.                     x = max(x, h);
  85.                     while (x <= p && sum + b[s[x]] < k)
  86.                     {
  87.                         sum += b[s[x]];
  88.                         ++x;
  89.                     }
  90.                     if (s[x] == last[s[h]])
  91.                         break;
  92.                     cur += 1ll * (s[h] - s[h - 1]) * (s[x] - s[h]) - 1ll * (s[h] - s[h - 1]) * (last[s[h]] - s[h]);
  93.                     last[s[h]] = s[x];
  94.                 }
  95.             }
  96.             --t;
  97.             //cout << ans << '\n';
  98.         } while (t >= i);
  99.     }
  100.     cout << (1ll * m * n * (m + 1) * (n + 1) / 4 - ans);
  101. }
  102.  
  103. int32_t main()
  104. {
  105.     ios::sync_with_stdio(0);
  106.     cin.tie(0);
  107.     cout.tie(0);
  108.     int t(1);
  109.     if (typetest)
  110.         cin >> t;
  111.     for (int _ = 1; _ <= t; ++_)
  112.     {
  113.         Read();
  114.         Solve();
  115.     }
  116. }
Advertisement
Add Comment
Please, Sign In to add comment