Alex_tz307

USACO 2016 US Open Contest, Silver Problem 2. Diamond Collector

Dec 4th, 2020
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.84 KB | None | 0 0
  1. // http://www.usaco.org/index.php?page=viewproblem2&cpid=643
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6. ifstream fin("diamond.in");
  7. ofstream fout("diamond.out");
  8.  
  9. void max_self(int &a, int b) {
  10.     a = max(a, b);
  11. }
  12.  
  13. int main() {
  14.     int N, K;
  15.     fin >> N >> K;
  16.     vector<int> a(N);
  17.     for(int i = 0; i < N; ++i)
  18.         fin >> a[i];
  19.     sort(a.begin(), a.end());
  20.     int r = 0;
  21.     vector<int> can(N);
  22.     for(int l = 0; l < N; ++l) {
  23.         while(r < N && a[r] - a[l] <= K)
  24.             ++r;
  25.         can[l] = r - l;
  26.     }
  27.     vector<int> suf_mx(N);
  28.     suf_mx[N - 1] = can[N - 1];
  29.     for(int i = N - 2; i >= 0; --i)
  30.         suf_mx[i] = max(suf_mx[i + 1], can[i]);
  31.     int ans = 0;
  32.     for(int i = 0; i < N; ++i)
  33.         if(i + can[i] < N)
  34.             max_self(ans, can[i] + suf_mx[i + can[i]]);
  35.     fout << ans;
  36. }
  37.  
Advertisement
Add Comment
Please, Sign In to add comment