제출 #1249416

#제출 시각아이디문제언어결과실행 시간메모리
1249416mondellbit선물 (IOI25_souvenirs)C++20
컴파일 에러
0 ms0 KiB
#include "souvenirs.h"

#include <bits/stdc++.h>
using namespace std;

#define INF (long long)1e18

vector<int> hidden_p;
vector<int> counter;

pair<vector<int>, long long> transaction(long long M) {  // Changed parameter type to long long
    vector<int> bought;
    for (int i = 0; i < hidden_p.size(); i++) {
        if (m >= hidden_p[i]) {
            m -= hidden_p[i];
            bought.push_back(i);
            counter[i]++;
        }
    }
    return make_pair(bought, m);
}

vector<int> buy_souvenirs(int N, long long P0) {
    vector<set<int>> depend(n);
    vector<int> sum(n);
    vector<int> ans(n, -1);
    ans[0] = p0;
    
    counter.assign(n, 0);
    
    while (true) {
        int left = 0;
        for (int i = 0; i < n; i++) {
            left += ans[i] == -1;
        }
        
        if (left == 0) {
            break;
        }
        
        bool have = false;
        
        for (int i = n - 1; i >= 0; i--) {
            if (ans[i] == -1) have = true;
            if (ans[i] != -1 && have) {
                auto [vv, ll] = transaction(ans[i] - 1);
                set<int> ss;
                for (auto x : vv) ss.insert(x), counter[x]++;
                int got = ans[i] - 1 - ll;
                
                for (int j = 0; j < n; j++) {
                    if (ans[j] != -1 && ss.count(j)) {
                        ss.erase(j);
                        got -= ans[j];
                    }
                }
                
                depend[i + 1] = ss;
                sum[i + 1] = got;
                break;
            }
            if (depend[i].size() == 1) {
                ans[i] = sum[i];
                depend[i].clear();
                
                for (int j = 0; j < n; j++) {
                    if (depend[j].count(i)) {
                        sum[j] -= ans[i];
                        depend[j].erase(i);
                    }
                }
                break;
            }
            if (depend[i].size()) {
                int x = sum[i] / (int)depend[i].size();
                auto [vv, ll] = transaction(x);
                set<int> ss;
                for (auto x : vv) ss.insert(x), counter[x]++;
                
                int got = x - ll;
                
                for (int j = 0; j < n; j++) {
                    if (ans[j] != -1 && ss.count(j)) {
                        got -= ans[j];
                        ss.erase(j);
                    }
                }
                
                assert(!ss.empty());
                int k = *ss.begin();
                depend[k] = ss;
                sum[k] = got;
                break;
            }
        }
    }
    
    for (int i = 0; i < n; i++) {
        while (counter[i] < i) {
            counter[i]++;
            transaction(ans[i]);
        }
    }
    
    return ans;
}

vector<int> find_prices(int N) {
    hidden_p.resize(N);
    counter.assign(N, 0);
    
    // First find p0
    int low = 1, high = INF;
    int p0 = -1;
    
    while (low <= high) {
        int mid = (low + high) / 2;
        auto [bought, rem] = transaction(mid);
        
        if (bought.size() == 1 && bought[0] == 0) {
            p0 = mid;
            break;
        }
        else if (bought.size() > 0 && bought[0] == 0) {
            high = mid - 1;
        }
        else {
            low = mid + 1;
        }
    }
    
    // Now use the buy_souvenirs function
    vector<int> prices = buy_souvenirs(N, p0);
    return prices;
}

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

souvenirs.cpp: In function 'std::pair<std::vector<int>, long long int> transaction(long long int)':
souvenirs.cpp:14:13: error: 'm' was not declared in this scope
   14 |         if (m >= hidden_p[i]) {
      |             ^
souvenirs.cpp:20:30: error: 'm' was not declared in this scope
   20 |     return make_pair(bought, m);
      |                              ^
souvenirs.cpp: At global scope:
souvenirs.cpp:23:13: error: ambiguating new declaration of 'std::vector<int> buy_souvenirs(int, long long int)'
   23 | vector<int> buy_souvenirs(int N, long long P0) {
      |             ^~~~~~~~~~~~~
In file included from souvenirs.cpp:1:
souvenirs.h:4:6: note: old declaration 'void buy_souvenirs(int, long long int)'
    4 | void buy_souvenirs(int N, long long P0);
      |      ^~~~~~~~~~~~~
souvenirs.cpp: In function 'std::vector<int> buy_souvenirs(int, long long int)':
souvenirs.cpp:24:29: error: 'n' was not declared in this scope
   24 |     vector<set<int>> depend(n);
      |                             ^
souvenirs.cpp:27:14: error: 'p0' was not declared in this scope; did you mean 'P0'?
   27 |     ans[0] = p0;
      |              ^~
      |              P0
souvenirs.cpp: In function 'std::vector<int> find_prices(int)':
souvenirs.cpp:6:13: warning: overflow in conversion from 'long long int' to 'int' changes value from '1000000000000000000' to '-1486618624' [-Woverflow]
    6 | #define INF (long long)1e18
      |             ^~~~~~~~~~~~~~~
souvenirs.cpp:113:25: note: in expansion of macro 'INF'
  113 |     int low = 1, high = INF;
      |                         ^~~
souvenirs.cpp:133:39: error: conversion from 'void' to non-scalar type 'std::vector<int>' requested
  133 |     vector<int> prices = buy_souvenirs(N, p0);
      |                          ~~~~~~~~~~~~~^~~~~~~