Submission #1283258

#TimeUsernameProblemLanguageResultExecution timeMemory
1283258edoComparing Plants (IOI20_plants)C++20
Compilation error
0 ms0 KiB
// #include "plants.h" #include <bits/stdc++.h> using namespace std; using ll = long long; using vi = vector<int>; using vll = vector<ll>; using vvi = vector<vi>; using vvll = vector<vll>; using pii = pair<int,int>; using pll = pair<ll,ll>; using ui = unsigned int; using ull = unsigned long long; using pui = pair<ui,ui>; using pull = pair<ull,ull>; template<typename T> using vc = std::vector<T>; #define YES cout << "YES\n" #define NO cout << "NO\n" #define yes cout << "yes\n" #define no cout << "no\n" #define Yes cout << "Yes\n" #define No cout << "No\n" template<typename T> void sc(T &x) { cin >> x; } template<typename T, typename U> void sc(pair<T,U> &p) { sc(p.first), sc(p.second); } template<typename T> void sc(vector<T> &v) { for (auto &x : v) sc(x); } template<typename... A> void sc(A&... a) { (sc(a), ...); } template<typename T> void _pt(const T &x){cout << x;} template<typename T, typename U> void _pt(const pair<T,U> &p){_pt(p.first); cout << ' '; _pt(p.second);} template<typename T> void _pt(const vector<T> &v){bool f=1; for(auto &x:v){if(!f) cout<<' '; _pt(x); f=0;}} template<typename... A> void pt(const A&... a){(_pt(a), ...);} template<typename T, typename U> bool umin(T &a, const U &b) { return b < a ? (a = b, true) : false; } template<typename T, typename U> bool umax(T &a, const U &b) { return b > a ? (a = b, true) : false; } #define GET_MACRO(_1,_2,_3,_4,NAME,...) NAME #define FOR1(n) for (int i=0; i<(n); ++i) #define FOR2(i,n) for (int i=0; i<(n); ++i) #define FOR3(i,l,r) for (int i=(l); i<(r); ++i) #define FOR4(i,l,r,k) for (int i=(l); i<(r); i+=(k)) #define FOR(...) GET_MACRO(__VA_ARGS__, FOR4, FOR3, FOR2, FOR1)(__VA_ARGS__) #define ROF1(n) for (int i=(n)-1; i>=0; --i) #define ROF2(i,n) for (int i=(n)-1; i>=0; --i) #define ROF3(i,l,r) for (int i=(r)-1; i>=(l); --i) #define ROF4(i,l,r,k) for (int i=(r)-1; i>=(l); i-=(k)) #define ROF(...) GET_MACRO(__VA_ARGS__, ROF4, ROF3, ROF2, ROF1)(__VA_ARGS__) #define all(c) (c).begin(), (c).end() #define allr(c) (c).rbegin(), (c).rend() #define eb emplace_back #define mp make_pair #define mt make_tuple #define fi first #define se second #define pb push_back #define trav(x,a) for (auto &x : (a)) #define sz(a) ((int)(a).size()) #define mem(a,v) memset(a, v, sizeof(a)) #define nl pt("\n") int n, k; vc<int> V, M; template<class Info, class Tag> struct LazySegmentTree { int n; std::vector<Info> info; std::vector<Tag> tag; LazySegmentTree() : n(0) {} LazySegmentTree(int n_, Info v_ = Info()) { init(n_, v_); } template<class T> LazySegmentTree(std::vector<T> init_) { init(init_); } void init(int n_, Info v_ = Info()) { init(std::vector(n_, v_)); } template<class T> void init(std::vector<T> init_) { n = init_.size(); info.assign(4 << std::__lg(n), Info()); tag.assign(4 << std::__lg(n), Tag()); std::function<void(int, int, int)> build = [&](int p, int l, int r) { if (r - l == 1) { info[p] = init_[l]; return; } int m = (l + r) / 2; build(2 * p, l, m); build(2 * p + 1, m, r); pull(p); }; build(1, 0, n); } void pull(int p) { info[p] = info[2 * p] + info[2 * p + 1]; } void apply(int p, const Tag &v) { info[p].apply(v); tag[p].apply(v); } void push(int p) { apply(2 * p, tag[p]); apply(2 * p + 1, tag[p]); tag[p] = Tag(); } void modify(int p, int l, int r, int x, const Info &v) { if (r - l == 1) { info[p] = v; return; } int m = (l + r) / 2; push(p); if (x < m) { modify(2 * p, l, m, x, v); } else { modify(2 * p + 1, m, r, x, v); } pull(p); } void modify(int p, const Info &v) { modify(1, 0, n, p, v); } Info rangeQuery(int p, int l, int r, int x, int y) { if (l >= y || r <= x) { return Info(); } if (l >= x && r <= y) { return info[p]; } int m = (l + r) / 2; push(p); return rangeQuery(2 * p, l, m, x, y) + rangeQuery(2 * p + 1, m, r, x, y); } Info rangeQuery(int l, int r) { return rangeQuery(1, 0, n, l, r); } void rangeApply(int p, int l, int r, int x, int y, const Tag &v) { if (l >= y || r <= x) { return; } if (l >= x && r <= y) { apply(p, v); return; } int m = (l + r) / 2; push(p); rangeApply(2 * p, l, m, x, y, v); rangeApply(2 * p + 1, m, r, x, y, v); pull(p); } void rangeApply(int l, int r, const Tag &v) { return rangeApply(1, 0, n, l, r, v); } template<class F> int findFirst(int p, int l, int r, int x, int y, F &&pred) { if (l >= y || r <= x) { return -1; } if (l >= x && r <= y && !pred(info[p])) { return -1; } if (r - l == 1) { return l; } int m = (l + r) / 2; push(p); int res = findFirst(2 * p, l, m, x, y, pred); if (res == -1) { res = findFirst(2 * p + 1, m, r, x, y, pred); } return res; } template<class F> int findFirst(int l, int r, F &&pred) { return findFirst(1, 0, n, l, r, pred); } template<class F> int findLast(int p, int l, int r, int x, int y, F &&pred) { if (l >= y || r <= x) { return -1; } if (l >= x && r <= y && !pred(info[p])) { return -1; } if (r - l == 1) { return l; } int m = (l + r) / 2; push(p); int res = findLast(2 * p + 1, m, r, x, y, pred); if (res == -1) { res = findLast(2 * p, l, m, x, y, pred); } return res; } template<class F> int findLast(int l, int r, F &&pred) { return findLast(1, 0, n, l, r, pred); } }; constexpr int inf = 1E9; constexpr int ninf = -inf; struct Tag { int add = 0; void apply(const Tag &t) { add += t.add; } }; struct Info { int mn = inf; int mx = ninf; void apply(const Tag &t) { mn += t.add; mx += t.add; } }; Info operator+(const Info &l, const Info &r) { return {std::min(l.mn, r.mn), std::max(l.mx, r.mx)}; } vc<int> DO(vc<int> r) { int N = sz(r); vc<Info> in(N); FOR(N) in[i].mn = in[i].mx = r[i]; LazySegmentTree<Info, Tag> seg(in); vc<int> ret(N); queue<int> q; auto h0 = [](const Info &x) { return x.mn <= 0 && x.mx >= 0; }; FOR(N) { int p = seg.findFirst(0, N, h0); while(p == -1) { int left = q.front(); q.pop(); Tag t; t.add = -1; seg.rangeApply(left, 2 * n, t); p = seg.findFirst(0, N, h0); } ret.at(p) = i; Info ban; ban.mn = ban.mx = inf; seg.modify(p, ban); Tag t; t.add = -1; seg.rangeApply(max(0, p - k + 1), p + 1, t); if(p < k - 1) { q.push(p - k + 1 + 2 * n); } } return ret; } void init(int K, vector<int> r) { n = sz(r); k = K; FOR(n) r.pb(r.at(i)); V = DO(r); trav(x, r) x = k - 1 - x; M = DO(r); } int compare_plants(int x, int y) { if(x > y) return -compare_plants(y, x); if(V.at(x) > V.at(y) || M.at(x + n) < M.at(y)) return -1; if(V.at(x + n) < V.at(y) || M.at(x) > M.at(y)) return 1; return 0; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int tmp = 3; vc<int> r = {0, 1, 1, 2}; init(tmp, r); FOR(2) { int x, y; sc(x, y); int ans = compare_plants(x , y); pt(ans); nl; } return 0; }

Compilation message (stderr)

/usr/bin/ld: /tmp/ccTYJGzl.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccavzHR4.o:plants.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status