제출 #722752

#제출 시각아이디문제언어결과실행 시간메모리
722752Mr_Husanboy사탕 분배 (IOI21_candies)C++17
컴파일 에러
0 ms0 KiB
#include "candies.h" #include <bits/stdc++.h> using namespace std; using ll = long long; template<typename T> int len(T &a){ return a.size(); } const ll infl = 1e18; // struct Segtree{ // struct node{ // ll mx = 0, mn = 0, add = 0; // void apply(ll x){ // mn += x; mx += x; // add += x; // } // }; // vector<node> t; // int n; // Segtree(int _n){ // n = _n; // t.resize(4 * n); // } // void push(int x){ // if(t[x].add){ // t[x << 1].apply(t[x].add); // t[x << 1 | 1].apply(t[x].add); // t[x].add = 0; // } // } // node merge(node a, node b){ // return {max(a.mx, b.mx), min(a.mn, b.mn), 0ll}; // } // void upd(int x, int lx, int rx, int l, int r, ll val){ // if(l <= lx && rx <= r){ // t[x].apply(val); // return; // } // if(r < lx || l > rx){ // return; // } // int m = (rx + lx) >> 1; // push(x); // upd(x << 1, lx, m, l, r, val); // upd(x << 1 | 1, m + 1, rx, l, r, val); // t[x] = merge(t[x << 1], t[x << 1 | 1]); // } // node get(int x, int lx, int rx, int l, int r){ // if(l <= lx && rx <= r){ // return t[x]; // } // if(r < lx || l > rx){ // return {0,0,0}; // } // push(x); // int m = (lx + rx) >> 1; // return merge(get(x << 1, lx, m, l, r), // get(x << 1 | 1, m + 1, rx, l, r)); // } // void upd(int l, int r, ll val){ // upd(1, 0, n - 1, l, r, val); // } // node get(int l, int r){ // return get(1, 0, n - 1, l, r); // } // }; #define int ll struct SegmentTree{ //To change struct Node{ //defaults ll mn = 0, mx = 0, add = 0, sum = 0; bool marked = false; void apply(int val){ sum += val; mn += val; mx += val; add += val; marked = true; } }; void push(int x){ if(t[x].marked){ t[x << 1].apply(t[x].add); t[x << 1 | 1].apply(t[x].add); t[x].add = 0; t[x].marked = false; } } Node merge(Node a, Node b){ Node res; res.mn = min(a.mn, b.mn); res.mx = max(a.mx, b.mx); res.sum = a.sum + b.sum; return res; } Node neutral; vector<Node> t; int n; //construction void init(int _n){ n = _n; t.assign(4 * n, neutral); } void build(vector<int> &a, int x, int lx, int rx){ if(lx == rx){ t[x].mn = a[lx]; return; } int mx = (lx + rx) >> 1; build(a, x << 1, lx, mx); build(a, x << 1 | 1, mx + 1, rx); t[x] = merge(t[x << 1], t[x << 1 | 1]); } void upd(int x, int lx, int rx, int l, int r, int val){ if(rx < l || r < lx) return; if(l <= lx && rx <= r){ t[x].apply(val); return; } push(x); int mx = (lx + rx) >> 1; upd(x << 1, lx, mx, l, r, val); upd(x << 1 | 1, mx + 1, rx, l, r, val); t[x] = merge(t[x << 1], t[x << 1 | 1]); } Node get(int x, int lx, int rx, int l, int r){ if(rx < l || r < lx){ return neutral; } if(l <= lx && rx <= r){ return t[x]; } push(x); int mx = (lx + rx) >> 1; return merge(get(x << 1, lx, mx, l, r), get(x << 1 | 1, mx + 1, rx, l, r)); } // lessen void build(vector<int> &a){ int sz = len(a); init(sz); build(a, 1, 0, n - 1); } void upd(int l, int r, int val){ upd(1, 0, n - 1, l, r, val); } Node get(int l, int r){ return get(1, 0, n - 1, l, r); } }; vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) { int n = c.size(); int m = len(v); SegmentTree t; t.init(m + 1); vector<vector<int>> in(n), out(n); for(int i = 0; i < m; i ++){ in[l[i]].push_back(i); out[r[i]].push_back(i); } for(int i = 0; i < n; i ++){ for(auto u : in[i]){ t.upd(0, u, -v[u]); } int l = 0, r = m; while(l <= r){ int mid = (l + r) >> 1; auto res = t.get(mid, m); if(res.mx - res.mn >= c[i]){ l = mid + 1; }else r = mid - 1; } r ++; if(r == 0 || t.get(r - 1, m).mx != t.get(r, m).mx){ c[i] = -t.get(r, m).mn; }else{ c[i] = c[i] - t.get(r, m).mx; } for(auto u : out[i]){ t.upd(0, u, v[u]); } } //for(auto u : suf) cout << u << ' ';cout << endl; return c; }

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

/usr/bin/ld: /tmp/ccZvYj3X.o: in function `main':
grader.cpp:(.text.startup+0x30e): undefined reference to `distribute_candies(std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >)'
collect2: error: ld returned 1 exit status