제출 #607534

#제출 시각아이디문제언어결과실행 시간메모리
607534Sam_a17카니발 티켓 (IOI20_tickets)C++14
25 / 100
789 ms101248 KiB
// #include "A.cpp"
#include <bits/stdc++.h>
// #include <vector>
using namespace std;
 
#define sz(x) (int((x).size()))
#define len(x) (int)x.length()
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define dbg(x) cout << #x << " " << x << endl;
#define uniq(x) x.resize(unique(all(x)) - x.begin());
 
#define pb push_back
#define ld long double
#define ll long long
 
// #include "tickets.h"
// #include <vector>
 
void allocate_tickets(vector<vector<int>> a);
 
struct node {
  int i, j;
  long long value;

  bool operator<(const node& other) const {
    return value < other.value;
  }
};

long long find_maximum(int k, std::vector<std::vector<int>> x) {
	int n = x.size();
	int m = x[0].size();
	std::vector<std::vector<int>> answer;
//  dbg(k)
  if(m == 1) {
    vector<vector<int>> answ;
    long long pat = 0;
    vector<long long> values;
    map<long long, int> mp;
    for(int i = 0; i < n; i++) {
      answ.push_back({0});
      values.push_back(x[i][0]);
      mp[x[i][0]]++;
      pat += x[i][0];
    }
 
    sort(all(values));
 
    ll s = INT64_MAX, left = 0, leftCnt = 0;
    for(auto i: mp) {
      leftCnt += i.second;
      left += i.second * i.first;
 
      ll rightCnt = n - leftCnt;
      pat -= i.second * i.first;
 
      s = min(s, leftCnt * i.first - left + pat - rightCnt * i.first);
    }
 
  	allocate_tickets(answ);
    return s;
  }
  else if(k == m) {
    vector<node> all_members;
    vector<deque<int>> plus_or_minus;
    vector<int> poped_front(n);

    plus_or_minus.resize(n);
    answer.resize(n);
    for(int i = 0; i < n; i++) {
      for(int j = 0; j < m; j++) {
        //
        plus_or_minus[i].resize(m);
        answer[i].resize(m);

        //
        all_members.push_back({i, j, x[i][j]});
      }
    }

    sort(all(all_members));

    int mid = (n * m) / 2;
    long long answ = 0;
    for(int i = 0; i < n * m; i++) {
      if(i < mid) {
        plus_or_minus[all_members[i].i][all_members[i].j] = 0;
        answ -= all_members[i].value;
      } else {             
        plus_or_minus[all_members[i].i][all_members[i].j] = 1;
        answ += all_members[i].value;
      }
    }
    
    for(int i = 0; i < m; i++) {
      int plus = n / 2, minus = n / 2;
      vector<node> new_round;
      vector<bool> vis(n);

      for(int j = 0; j < n; j++) {
        if(!vis[j] && plus && sz(plus_or_minus[j]) && plus_or_minus[j][0] == 1 && plus_or_minus[j].back() == 1) {
          int k = plus_or_minus[j].size() - 1 + poped_front[j];
          plus_or_minus[j].pop_back();
          answer[j][k] = i, vis[j] = true;
          plus--;
        }
      }

      for(int j = 0; j < n; j++) {
        if(!vis[j] && minus && sz(plus_or_minus[j]) && plus_or_minus[j][0] == 0 && plus_or_minus[j].back() == 0) {
          int k = plus_or_minus[j].size() - 1 + poped_front[j];
          plus_or_minus[j].pop_back();
          answer[j][k] = i, vis[j] = true;
          minus--;
        }
      }

      for(int j = 0; j < n; j++) {
        if(!vis[j] && plus && sz(plus_or_minus[j]) && plus_or_minus[j].back() == 1) {
          int k = plus_or_minus[j].size() - 1 + poped_front[j];
          plus_or_minus[j].pop_back();
          answer[j][k] = i, vis[j] = true;
          plus--;
        } else if(!vis[j] && minus && sz(plus_or_minus[j]) && plus_or_minus[j][0] == 0) {
          int k = poped_front[j];
          plus_or_minus[j].pop_front();
          answer[j][k] = i, vis[j] = true;
          poped_front[j]++;
          minus--;
        }
      }

      assert(minus == 0 && plus == 0);
    }

    allocate_tickets(answer);
    return answ;
  }
	allocate_tickets(answer);
	return 1;
} 
#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...