chaosagent

USACO 2015 Dec Platinum 2

Dec 16th, 2015
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.66 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4. #include <set>
  5.  
  6. using namespace std;
  7.  
  8. int main() {
  9.     FILE *fin = fopen("cardgame.in", "r");
  10.     FILE *fout = fopen("cardgame.out", "w");
  11.     int n;
  12.     fscanf(fin, "%d", &n);
  13.  
  14.     vector<int> elsie(n);
  15.     for (int i = 0; i < n; i++) {
  16.         int e;
  17.         fscanf(fin, "%d", &e);
  18.         elsie[i] = e;
  19.     }
  20.  
  21.     set<int> elsieset(elsie.begin(), elsie.end());
  22.  
  23.     set<int> bessie;
  24.     int preve = 0;
  25.     for (int e : elsieset) {
  26.         for (int i = preve + 1; i < e; i++) {
  27.             bessie.insert(i);
  28.         }
  29.         preve = e;
  30.     }
  31.     for (int i = preve + 1; i < 2 * n + 1; i++) {
  32.         bessie.insert(i);
  33.     }
  34.  
  35.     set<int> bessie_tmp(bessie);
  36.     vector<int> rupper(n);
  37.     int wupper = 0;
  38.     for (int elsiei = 0; elsiei < n; elsiei++) {
  39.         int e = elsie[elsiei];
  40.         set<int>::iterator touse = bessie_tmp.lower_bound(e);
  41.         if (touse != bessie_tmp.end()) {
  42.             bessie_tmp.erase(touse);
  43.             wupper++;
  44.         }
  45.         rupper[elsiei] = wupper;
  46.     }
  47.  
  48.     bessie_tmp = set<int>(bessie);
  49.     vector<int> rlower(n);
  50.     int wlower = 0;
  51.     for (int elsiei = n - 1; elsiei >= 0; elsiei--) {
  52.         int e = elsie[elsiei];
  53.         set<int>::iterator touse = bessie_tmp.lower_bound(e);
  54.         if (touse != bessie_tmp.begin()) {
  55.             bessie_tmp.erase(--touse);
  56.             wlower++;
  57.         }
  58.         rlower[elsiei] = wlower;
  59.     }
  60.  
  61.     int best = 0;
  62.     for (int i = -1; i < n; i++) {
  63.         best = max(best, (i >= 0 ? rupper[i] : 0) + (i + 1 < n ? rlower[i + 1] : 0));
  64.     }
  65.  
  66.     fprintf(fout, "%d\n", best);
  67.     return 0;
  68. }
Add Comment
Please, Sign In to add comment