제출 #722125

#제출 시각아이디문제언어결과실행 시간메모리
722125danikoynov카니발 티켓 (IOI20_tickets)C++14
55 / 100
995 ms129136 KiB
#include "tickets.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxn = 1510;

int N, M, K, used[maxn][maxn], vis[maxn];
vector < vector < int > > answer;
vector < int > free_box[maxn];
struct element
{
    ll max_pos, min_pos, delta, row;

    bool operator < (const element &e) const
    {
        return delta < e.delta;
    }
};

struct box
{
    int row, col;
    ll val;

    bool operator < (const box &bx) const
    {
        return val < bx.val;
    }

};

bool cmp_box(box b1, box b2)
{
    return b1.row < b2.row;
}
long long find_maximum(int k, vector < vector < int > > x)
{
    N = x.size();
    M = x[0].size();
    K = k;
    ll max_val = 0;
    for (int i = 0; i < N; i ++)
        for (int j = 0; j < M; j ++)
            max_val = max(max_val, (ll)(x[i][j]));
    answer.resize(N);
    for (int i = 0; i < N; i++)
    {
        answer[i].resize(M, - 1);
    }

    ll max_prize = 0;
    if (M == 1 || K == 1)
    {
        for (int round = 0; round < k; round ++)
        {
            vector < element > arr;
            for (int i = 0; i < N; i ++)
            {
                element cur;
                cur.row = i;
                cur.min_pos = cur.max_pos = 0;
                while(used[i][cur.min_pos] == 1)
                    cur.min_pos ++;
                cur.max_pos = cur.min_pos;
                for (int j = 0; j < M; j ++)
                {
                    if (used[i][j] == 1)
                        continue;
                    if (x[i][j] < x[i][cur.min_pos])
                        cur.min_pos = j;
                    if (x[i][j] > x[i][cur.max_pos])
                        cur.max_pos = j;
                }
                ///cout << "here " << round << " " << cur.row << " " << cur.max_pos << " " << cur.min_pos << endl;
                cur.delta =  (x[cur.row][cur.max_pos] + x[cur.row][cur.min_pos]);
                arr.push_back(cur);
            }

            sort(arr.begin(), arr.end());
            for (int i = 0; i < N; i ++)
            {
                element cur = arr[i];
                if (i < N / 2)
                {
                    max_prize = max_prize - x[cur.row][cur.min_pos];
                    ///cout << cur.row << " :: " << cur.min_pos << endl;
                    used[cur.row][cur.min_pos] = 1;
                    answer[cur.row][cur.min_pos] = round;
                }
                else
                {
                    max_prize = max_prize + x[cur.row][cur.max_pos];
                    ///cout << cur.row << " :: " << cur.max_pos << endl;
                    used[cur.row][cur.max_pos] = 1;
                    answer[cur.row][cur.max_pos] = round;
                }
            }
        }
    }
    else if (M == K)
    {
        vector < box > vec;
        for (int i = 0; i < N; i ++)
            for (int j = 0; j < M; j ++)
            {
                box b;
                b.row = i;
                b.col = j;
                b.val = x[i][j];
                vec.push_back(b);
            }

        sort(vec.begin(), vec.end());
        vector < box > small, big;
        for (int i = 0; i < vec.size() / 2; i ++)
            small.push_back(vec[i]);
        for (int i = vec.size() / 2; i < vec.size(); i ++)
            big.push_back(vec[i]);

        sort(small.begin(), small.end(), cmp_box);
        sort(big.begin(), big.end(), cmp_box);
        int turn = 0;
        for (int i = 0; i < small.size(); i ++)
        {
            box b = small[i];
            answer[b.row][b.col] = turn ++;
            if (turn == k)
                turn = 0;

            max_prize = max_prize - b.val;

        }
        for (int i = 0; i < N; i ++)
        {
            for (int j = 0; j < M; j ++)
            {
                if (answer[i][j] == -1)
                    continue;
                vis[answer[i][j]] = 1;
            }

            for (int j = 0; j < M; j ++)
            {
                if (!vis[j])
                    free_box[i].push_back(j);
                vis[j] = 0;
            }
        }
        for (int i = 0; i < big.size(); i ++)
        {
            box b = big[i];
            answer[b.row][b.col] = free_box[b.row].back();
            free_box[b.row].pop_back();

            max_prize = max_prize + b.val;

        }
    }
    else if (max_val <= 1)
    {
        int cnt[maxn], pt[2][maxn];
        for (int i = 0; i < N; i ++)
        {
            pt[0][i] = 0;
            pt[1][i] = M - 1;
            for (int j = 0; j < M; j ++)
            cnt[i] += x[i][j];
        }

        for (int round = 0; round < k; round ++)
        {
            vector < pair < int, int > > vec;
            for (int i = 0; i < N; i ++)
            vec.push_back({cnt[i], i});

            sort(vec.begin(), vec.end());
            for (int i = 0; i < N / 2; i ++)
            {
                pair < int, int > cur = vec[i];
                max_prize = max_prize - x[cur.second][pt[0][cur.second]];
                cnt[cur.second] = cnt[cur.second] - x[cur.second][pt[0][cur.second]];
                answer[cur.second][pt[0][cur.second] ++] = round;
            }

            for (int i = N / 2; i < N; i ++)
            {
                pair < int, int > cur = vec[i];
                max_prize = max_prize + x[cur.second][pt[1][cur.second]];
                cnt[cur.second] = cnt[cur.second] - x[cur.second][pt[1][cur.second]];
                answer[cur.second][pt[1][cur.second] --] = round;
            }
        }
    }
    allocate_tickets(answer);
    return max_prize;
}

컴파일 시 표준 에러 (stderr) 메시지

tickets.cpp: In function 'long long int find_maximum(int, std::vector<std::vector<int> >)':
tickets.cpp:116:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<box>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  116 |         for (int i = 0; i < vec.size() / 2; i ++)
      |                         ~~^~~~~~~~~~~~~~~~
tickets.cpp:118:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<box>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  118 |         for (int i = vec.size() / 2; i < vec.size(); i ++)
      |                                      ~~^~~~~~~~~~~~
tickets.cpp:124:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<box>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  124 |         for (int i = 0; i < small.size(); i ++)
      |                         ~~^~~~~~~~~~~~~~
tickets.cpp:150:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<box>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  150 |         for (int i = 0; i < big.size(); i ++)
      |                         ~~^~~~~~~~~~~~
#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...