Advertisement
Dang_Quan_10_Tin

PAIR (VOI 2022)

Mar 5th, 2022
975
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.62 KB | None | 0 0
  1. #define task "PAIR"
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <cstring>
  7.  
  8. using namespace std;
  9.  
  10. using ll = long long;
  11. using ld = long double;
  12.  
  13. constexpr int N = 2e3 + 5;
  14.  
  15. struct SegmentTree
  16. {
  17.     int n, st[N * 4];
  18.     SegmentTree()
  19.     {
  20.         memset(st, 0, sizeof st);
  21.     }
  22.  
  23.     void Update(int id, int l, int r, const int &x, const int &v)
  24.     {
  25.         if (l > x || r < x)
  26.             return;
  27.         if (l == x && r == x)
  28.         {
  29.             st[id] = v;
  30.             return;
  31.         }
  32.  
  33.         Update(id << 1, l, (l + r) / 2, x, v);
  34.         Update(id << 1 | 1, (l + r) / 2 + 1, r, x, v);
  35.  
  36.         st[id] = max(st[id << 1], st[id << 1 | 1]);
  37.     }
  38.  
  39.     void Update(int p, int v)
  40.     {
  41.         Update(1, 1, n, p, v);
  42.     }
  43.  
  44.     int Get(int id, int l, int r, const int &a, const int &b)
  45.     {
  46.         if (l > b || r < a)
  47.             return 0;
  48.         if (l >= a && r <= b)
  49.             return st[id];
  50.  
  51.         return max(Get(id << 1, l, (l + r) / 2, a, b), Get(id << 1 | 1, (l + r) / 2 + 1, r, a, b));
  52.     }
  53.  
  54.     int Get(int l, int r)
  55.     {
  56.         return Get(1, 1, n, l, r);
  57.     }
  58. } f;
  59.  
  60. int n, d, a[N];
  61. int dp[N * N];
  62.  
  63. vector<pair<int, int>> s, p;
  64.  
  65. void Read()
  66. {
  67.     cin >> n >> d;
  68.     f.n = n;
  69.  
  70.     for (int i = 1; i <= n; ++i)
  71.         cin >> a[i];
  72.  
  73.     sort(a + 1, a + n + 1);
  74. }
  75.  
  76. int Get(pair<int, int> x)
  77. {
  78.     return a[x.first] + a[x.second];
  79. }
  80.  
  81. int Cal(int x, int y)
  82. {
  83.     p.clear();
  84.     for (int i = x; i <= y; ++i)
  85.         p.emplace_back(s[i]);
  86.  
  87.     sort(p.begin(), p.end(), [&](const pair<int, int> &x, const pair<int, int> &y)
  88.          { return x.second < y.second || (x.second == y.second && x.first > y.first); });
  89.  
  90.     for (int i = 0, j = 0; i < (int)p.size(); ++i)
  91.     {
  92.         while (j < (int)p.size() && p[i].second == p[j].second)
  93.             ++j;
  94.  
  95.         for (int t = i; t < j; ++t)
  96.             dp[t] = f.Get(p[t].first + 1, p[t].second - 1) + 1;
  97.  
  98.         for (int t = i; t < j; ++t)
  99.             f.Update(p[t].first, max(f.Get(p[t].first, p[t].first), dp[t]));
  100.  
  101.         i = j - 1;
  102.     }
  103.  
  104.     for (int i = 0; i < (int)p.size(); ++i)
  105.         f.Update(p[i].first, 0);
  106.  
  107.     return *max_element(dp, dp + p.size());
  108. }
  109.  
  110. void Sub_3()
  111. {
  112.     for (int i = 1; i <= n; ++i)
  113.         for (int j = i + 1; j <= n; ++j)
  114.             s.emplace_back(i, j);
  115.  
  116.     sort(s.begin(), s.end(), [&](const pair<int, int> &x, const pair<int, int> &y)
  117.          { return Get(x) < Get(y); });
  118.  
  119.     int ans(0);
  120.  
  121.     for (int i = 0, j = 0; i < (int)s.size(); ++i)
  122.     {
  123.         while (j < (int)s.size() && Get(s[i]) == Get(s[j]))
  124.             ++j;
  125.  
  126.         ans = max(ans, Cal(i, j - 1));
  127.  
  128.         i = j - 1;
  129.     }
  130.  
  131.     cout << ans;
  132. }
  133.  
  134. void Sub_5()
  135. {
  136.     for (int i = 1; i <= n; ++i)
  137.         for (int j = i + 1; j <= n; ++j)
  138.             s.emplace_back(i, j);
  139.  
  140.     sort(s.begin(), s.end(), [&](const pair<int, int> &x, const pair<int, int> &y)
  141.          { return Get(x) < Get(y); });
  142.  
  143.     int ans(0);
  144.  
  145.     for (int i = 0, j = 0, t = 0; i < (int)s.size(); ++i)
  146.     {
  147.         while (j < (int)s.size() && Get(s[i]) == Get(s[j]))
  148.             ++j;
  149.         while (t < (int)s.size() && Get(s[t]) - Get(s[i]) <= 1)
  150.             ++t;
  151.  
  152.         ans = max(ans, Cal(i, t - 1));
  153.  
  154.         i = j - 1;
  155.     }
  156.  
  157.     cout << ans;
  158. }
  159.  
  160. int32_t main()
  161. {
  162.     ios_base::sync_with_stdio(0);
  163.     cin.tie(0);
  164.     cout.tie(0);
  165.  
  166.     if (fopen(task ".INP", "r"))
  167.     {
  168.         freopen(task ".INP", "r", stdin);
  169.         freopen(task ".OUT", "w", stdout);
  170.     }
  171.  
  172.     Read();
  173.  
  174.     if (d == 0)
  175.         Sub_3();
  176.     else
  177.         Sub_5();
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement