제출 #1243446

#제출 시각아이디문제언어결과실행 시간메모리
1243446aykhn나일강 (IOI24_nile)C++20
컴파일 에러
0 ms0 KiB
#include "nile.h"
#include <vector>
#include <algorithm>
#include <limits>

using ll = long long;
static const ll NEG_INF = std::numeric_limits<ll>::min() / 4;

// 2x2 max-plus matrix
struct Mat {
    ll a[2][2];
};

// Max-plus multiplication: C = B * A
static Mat mmul(const Mat &B, const Mat &A) {
    Mat C;
    for(int i = 0; i < 2; i++) {
        for(int j = 0; j < 2; j++) {
            ll v = NEG_INF;
            for(int k = 0; k < 2; k++) {
                v = std::max(v, B.a[i][k] + A.a[k][j]);
            }
            C.a[i][j] = v;
        }
    }
    return C;
}

std::vector<long long> calculate_costs(
    std::vector<int> W, std::vector<int> A,
    std::vector<int> B, std::vector<int> E) {
    int N = W.size(), Q = E.size();
    
    // base sum
    long long sumA = 0;
    for(int i = 0; i < N; i++) sumA += A[i];
    if(N == 1) return std::vector<ll>(Q, sumA);

    // sort items by weight
    struct It{int w, idx;};
    std::vector<It> it(N);
    for(int i=0;i<N;i++) it[i]={W[i],i};
    std::sort(it.begin(), it.end(),[](auto &x,auto &y){return x.w<y.w;});
    
    // compute gaps
    std::vector<pair<int,int>> gaps;
    for(int k=1;k<N;k++) gaps.emplace_back(it[k].w - it[k-1].w, k);
    std::sort(gaps.begin(), gaps.end());

    // queries sorted
    vector<pair<int,int>> qs(Q);
    for(int i=0;i<Q;i++) qs[i]={E[i],i};
    sort(qs.begin(), qs.end());
    
    // DSU
    vector<int> p(N), sz(N,1);
    vector<long long> sumd(N), mind(N);
    for(int i=0;i<N;i++){
        p[i]=i;
        sumd[i] = (long long)A[it[i].idx] - B[it[i].idx];
        mind[i] = sumd[i];
    }
    function<int(int)> find=[&](int x){return p[x]==x?x:p[x]=find(p[x]);};
    auto comp_val=[&](int r)->long long{
        // matched sum in component: if size even sumd, else sumd - mind
        if(sz[r]%2==0) return sumd[r];
        else return sumd[r] - mind[r];
    };
    long long matched=0;
    // initially no matches
    
    vector<long long> ans(Q);
    int ptr=0;
    for(auto &qr:qs){
        int D=qr.first, qi=qr.second;
        while(ptr<(int)gaps.size() && gaps[ptr].first<=D){
            int k=gaps[ptr].second;
            int u = find(k-1), v = find(k);
            if(u!=v){
                // remove old contributions
                matched -= comp_val(u);
                matched -= comp_val(v);
                // unify
                p[v]=u;
                sz[u]+=sz[v];
                sumd[u]+=sumd[v];
                mind[u]=min(mind[u], mind[v]);
                // add new
                matched += comp_val(u);
            }
            ptr++;
        }
        ans[qi] = sumA - matched;
    }
    return ans;
}

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

nile.cpp: In function 'std::vector<long long int> calculate_costs(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
nile.cpp:46:17: error: 'pair' was not declared in this scope; did you mean 'std::pair'?
   46 |     std::vector<pair<int,int>> gaps;
      |                 ^~~~
      |                 std::pair
In file included from /usr/include/c++/11/bits/stl_algobase.h:64,
                 from /usr/include/c++/11/vector:60,
                 from nile.h:1,
                 from nile.cpp:1:
/usr/include/c++/11/bits/stl_pair.h:211:12: note: 'std::pair' declared here
  211 |     struct pair
      |            ^~~~
nile.cpp:46:29: error: template argument 1 is invalid
   46 |     std::vector<pair<int,int>> gaps;
      |                             ^~
nile.cpp:46:29: error: template argument 2 is invalid
nile.cpp:47:31: error: request for member 'emplace_back' in 'gaps', which is of non-class type 'int'
   47 |     for(int k=1;k<N;k++) gaps.emplace_back(it[k].w - it[k-1].w, k);
      |                               ^~~~~~~~~~~~
nile.cpp:48:20: error: request for member 'begin' in 'gaps', which is of non-class type 'int'
   48 |     std::sort(gaps.begin(), gaps.end());
      |                    ^~~~~
nile.cpp:48:34: error: request for member 'end' in 'gaps', which is of non-class type 'int'
   48 |     std::sort(gaps.begin(), gaps.end());
      |                                  ^~~
nile.cpp:51:5: error: 'vector' was not declared in this scope
   51 |     vector<pair<int,int>> qs(Q);
      |     ^~~~~~
nile.cpp:51:5: note: suggested alternatives:
In file included from /usr/include/c++/11/vector:67,
                 from nile.h:1,
                 from nile.cpp:1:
/usr/include/c++/11/bits/stl_vector.h:389:11: note:   'std::vector'
  389 |     class vector : protected _Vector_base<_Tp, _Alloc>
      |           ^~~~~~
In file included from nile.h:1,
                 from nile.cpp:1:
/usr/include/c++/11/vector:86:13: note:   'std::pmr::vector'
   86 |       using vector = std::vector<_Tp, polymorphic_allocator<_Tp>>;
      |             ^~~~~~
nile.cpp:51:17: error: expected primary-expression before 'int'
   51 |     vector<pair<int,int>> qs(Q);
      |                 ^~~
nile.cpp:52:26: error: 'qs' was not declared in this scope
   52 |     for(int i=0;i<Q;i++) qs[i]={E[i],i};
      |                          ^~
nile.cpp:53:10: error: 'qs' was not declared in this scope
   53 |     sort(qs.begin(), qs.end());
      |          ^~
nile.cpp:53:5: error: 'sort' was not declared in this scope
   53 |     sort(qs.begin(), qs.end());
      |     ^~~~
nile.cpp:53:5: note: suggested alternatives:
In file included from /usr/include/c++/11/algorithm:74,
                 from nile.cpp:3:
/usr/include/c++/11/pstl/glue_algorithm_defs.h:296:1: note:   'std::sort'
  296 | sort(_ExecutionPolicy&& __exec, _RandomAccessIterator __first, _RandomAccessIterator __last);
      | ^~~~
In file included from /usr/include/c++/11/algorithm:64,
                 from nile.cpp:3:
/usr/include/c++/11/bits/ranges_algo.h:1834:30: note:   'std::ranges::sort'
 1834 |   inline constexpr __sort_fn sort{};
      |                              ^~~~
nile.cpp:56:12: error: expected primary-expression before 'int'
   56 |     vector<int> p(N), sz(N,1);
      |            ^~~
nile.cpp:57:12: error: expected primary-expression before 'long'
   57 |     vector<long long> sumd(N), mind(N);
      |            ^~~~
nile.cpp:59:9: error: 'p' was not declared in this scope
   59 |         p[i]=i;
      |         ^
nile.cpp:60:9: error: 'sumd' was not declared in this scope; did you mean 'sumA'?
   60 |         sumd[i] = (long long)A[it[i].idx] - B[it[i].idx];
      |         ^~~~
      |         sumA
nile.cpp:61:9: error: 'mind' was not declared in this scope
   61 |         mind[i] = sumd[i];
      |         ^~~~
nile.cpp:63:5: error: 'function' was not declared in this scope; did you mean 'std::function'?
   63 |     function<int(int)> find=[&](int x){return p[x]==x?x:p[x]=find(p[x]);};
      |     ^~~~~~~~
      |     std::function
In file included from /usr/include/c++/11/functional:59,
                 from /usr/include/c++/11/pstl/glue_algorithm_defs.h:13,
                 from /usr/include/c++/11/algorithm:74,
                 from nile.cpp:3:
/usr/include/c++/11/bits/std_function.h:111:11: note: 'std::function' declared here
  111 |     class function;
      |           ^~~~~~~~
nile.cpp:63:14: error: expected primary-expression before 'int'
   63 |     function<int(int)> find=[&](int x){return p[x]==x?x:p[x]=find(p[x]);};
      |              ^~~
nile.cpp: In lambda function:
nile.cpp:66:12: error: 'sz' was not declared in this scope
   66 |         if(sz[r]%2==0) return sumd[r];
      |            ^~
nile.cpp:66:31: error: 'sumd' was not declared in this scope; did you mean 'sumA'?
   66 |         if(sz[r]%2==0) return sumd[r];
      |                               ^~~~
      |                               sumA
nile.cpp:67:21: error: 'sumd' was not declared in this scope; did you mean 'sumA'?
   67 |         else return sumd[r] - mind[r];
      |                     ^~~~
      |                     sumA
nile.cpp:67:31: error: 'mind' was not declared in this scope
   67 |         else return sumd[r] - mind[r];
      |                               ^~~~
nile.cpp: In function 'std::vector<long long int> calculate_costs(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
nile.cpp:72:12: error: expected primary-expression before 'long'
   72 |     vector<long long> ans(Q);
      |            ^~~~
nile.cpp:76:29: error: request for member 'size' in 'gaps', which is of non-class type 'int'
   76 |         while(ptr<(int)gaps.size() && gaps[ptr].first<=D){
      |                             ^~~~
nile.cpp:76:43: error: invalid types 'int[int]' for array subscript
   76 |         while(ptr<(int)gaps.size() && gaps[ptr].first<=D){
      |                                           ^
nile.cpp:77:23: error: invalid types 'int[int]' for array subscript
   77 |             int k=gaps[ptr].second;
      |                       ^
nile.cpp:78:21: error: 'find' was not declared in this scope
   78 |             int u = find(k-1), v = find(k);
      |                     ^~~~
nile.cpp:78:21: note: suggested alternatives:
In file included from /usr/include/c++/11/algorithm:74,
                 from nile.cpp:3:
/usr/include/c++/11/pstl/glue_algorithm_defs.h:60:1: note:   'std::find'
   60 | find(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value);
      | ^~~~
In file included from /usr/include/c++/11/bits/ranges_algo.h:36,
                 from /usr/include/c++/11/algorithm:64,
                 from nile.cpp:3:
/usr/include/c++/11/bits/ranges_util.h:432:30: note:   'std::ranges::find'
  432 |   inline constexpr __find_fn find{};
      |                              ^~~~
nile.cpp:79:19: error: 'v' was not declared in this scope
   79 |             if(u!=v){
      |                   ^
nile.cpp:84:17: error: 'p' was not declared in this scope
   84 |                 p[v]=u;
      |                 ^
nile.cpp:85:17: error: 'sz' was not declared in this scope
   85 |                 sz[u]+=sz[v];
      |                 ^~
nile.cpp:86:17: error: 'sumd' was not declared in this scope; did you mean 'sumA'?
   86 |                 sumd[u]+=sumd[v];
      |                 ^~~~
      |                 sumA
nile.cpp:87:17: error: 'mind' was not declared in this scope
   87 |                 mind[u]=min(mind[u], mind[v]);
      |                 ^~~~
nile.cpp:87:25: error: 'min' was not declared in this scope
   87 |                 mind[u]=min(mind[u], mind[v]);
      |                         ^~~
nile.cpp:87:25: note: suggested alternatives:
In file included from /usr/include/c++/11/vector:62,
                 from nile.h:1,
                 from nile.cpp:1:
/usr/include/c++/11/bits/stl_algo.h:3455:5: note:   'std::min'
 3455 |     min(initializer_list<_Tp> __l, _Compare __comp)
      |     ^~~
In file included from /usr/include/c++/11/algorithm:64,
                 from nile.cpp:3:
/usr/include/c++/11/bits/ranges_algo.h:2957:29: note:   'std::ranges::min'
 2957 |   inline constexpr __min_fn min{};
      |                             ^~~
nile.cpp:93:9: error: 'ans' was not declared in this scope; did you mean 'abs'?
   93 |         ans[qi] = sumA - matched;
      |         ^~~
      |         abs
nile.cpp:93:13: error: 'qi' was not declared in this scope
   93 |         ans[qi] = sumA - matched;
      |             ^~
nile.cpp:95:12: error: 'ans' was not declared in this scope; did you mean 'abs'?
   95 |     return ans;
      |            ^~~
      |            abs