제출 #320750

#제출 시각아이디문제언어결과실행 시간메모리
320750MiricaMateiCarnival Tickets (IOI20_tickets)C++14
100 / 100
963 ms98460 KiB
#include <bits/stdc++.h>
#include "tickets.h"

using namespace std;

const int MAXN = 1505;

struct Srt {
  int s;
  int i, j;
  bool operator <(const Srt& other) const {
    return s < other.s;
  }
};

int l[MAXN], r[MAXN];

/*void allocate_tickets(vector<vector<int> >v) {
  for (auto it1:v) {
    for (auto it2:it1)
      cout << it2 << ' ';
    cout << '\n';
  }
}*/

long long find_maximum(int k, vector<vector<int> >v) {
  int n = v.size();
  int m = v[0].size();
  vector<vector<int> >s;
  vector<int>aux(m, -1);
  for (int i = 0; i < n; ++i) {
    s.push_back(aux);
    r[i] = m - 1;
  }
  vector<Srt>srt;
  long long ans = 0;
  for (int i = 0; i < n; ++i) {
    for (int j = r[i]; j >= r[i] - k + 1; --j)
      ans += v[i][j];
    r[i] = r[i] - k + 1;
    for (int j = 0; j + m - k < m; ++j)
      srt.push_back({v[i][j] + v[i][j + m - k], i, j});
  }
  sort(srt.begin(), srt.end());
  for (int i = 0; i < n * k / 2; ++i) {
    ans -= srt[i].s;
    r[srt[i].i]++;
    l[srt[i].i]++;
  }
  vector<int>vis(n);
  while (k--) {
    int pl = n / 2, mn = n / 2;
    for (int i = 0; i < n; ++i) {
      if (l[i] == 0) {
        pl--;
        s[i][r[i]] = k;
        r[i]++;
        vis[i] = 1;
      } else if (r[i] == m) {
        mn--;
        l[i]--;
        s[i][l[i]] = k;
        vis[i] = 1;
      }
    }
    for (int i = 0; i < n; ++i) {
      if (vis[i]) {
        vis[i] = 0;
        continue;
      }
      if (mn && l[i]) {
        mn--;
        l[i]--;
        s[i][l[i]] = k;
      } else {
        pl--;
        s[i][r[i]] = k;
        r[i]++;
      }
    }
  }
  allocate_tickets(s);
  return ans;
}

/*int main() {
  freopen("date.in", "r", stdin);
  freopen("date.out", "w", stdout);

  int n, m, k;
  cin >> n >> m >> k;
  vector<vector<int> >v;
  for (int i = 0; i < n; ++i) {
    vector<int>g(m);
    for (int j = 0; j < m; ++j)
      cin >> g[j];
    v.push_back(g);
  }

  cout << find_maximum(k, v);

  return 0;
}*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...