Submission #429803

#TimeUsernameProblemLanguageResultExecution timeMemory
429803schseHandcrafted Gift (IOI20_gift)C++17
15 / 100
673 ms23104 KiB
#include "gift.h" #include <bits/stdc++.h> using namespace std; #ifndef EVAL #include "grader.cpp" #endif struct node { int val = -1; int substr = 0; }; struct segtree { vector<node> tree = vector<node>(1 << 20); void lazzy(int index) { if (tree[index].val == -1) { if (tree[index * 2].val == -1) tree[index * 2].substr += tree[index].substr; else tree[index * 2].val -= tree[index].substr; if (tree[index * 2 + 1].val == -1) tree[index * 2 + 1].substr += tree[index].substr; else tree[index * 2 + 1].val -= tree[index].substr; } else { tree[index].val -= tree[index].substr; tree[index].substr = 0; } if (tree[index].val != -1) tree[index * 2] = tree[index * 2 + 1] = {tree[index].val, 0}; tree[index] = {-1, 0}; } void updset(int index, int b, int e, int l, int r, int v) { if (l <= b && e <= r) { tree[index] = {v, 0}; return; } if (e <= l || r <= b) return; lazzy(index); updset(index * 2, b, (b + e) / 2, l, r, v); updset(index * 2 + 1, (b + e) / 2, e, l, r, v); } void updsubs(int index, int b, int e, int l, int r, int v) { if (l <= b && e <= r) { tree[index] = {tree[index].val, v}; return; } if (e <= l || r <= b) return; lazzy(index); updsubs(index * 2, b, (b + e) / 2, l, r, v); updsubs(index * 2 + 1, (b + e) / 2, e, l, r, v); } int query(int index, int b, int e, int p) { if (p < b || p >= e) return 0; if (e - b == 1) return tree[index].val; lazzy(index); return query(index * 2, b, (b + e) / 2, p) + query(index * 2 + 1, (b + e) / 2, e, p); } } tree; int construct(int n, int r, std::vector<int> a, std::vector<int> b, std::vector<int> x) { for (int i = 0; i < n; i++) tree.updset(1, 0, n, i, i + 1, i); vector<int> prefix(n); iota(prefix.begin(), prefix.end(), 0); for (int i = 0; i < a.size(); i++) //update single color { if (x[i] == 1) { int va = tree.query(1, 0, n, a[i]); int vb = tree.query(1, 0, n, b[i]); tree.updset(1, 0, n, a[i], b[i], va); tree.updsubs(1, 0, n, b[i], n, vb - va); /* for (int e = b[i] + 1; e < n; e++) prefix[e] -= prefix[b[i]] - prefix[a[i]]; for (int e = a[i] + 1; e < b[i] + 1; e++) prefix[e] = prefix[a[i]]; */ } } for (int i = 0; i < a.size(); i++) //check wetherpossible { if (x[i] == 2) { int va = tree.query(1, 0, n, a[i]); int vb = tree.query(1, 0, n, b[i]); if (vb - va < 1) return 0; /*if (prefix[b[i]] - prefix[a[i]] < 1) return 0;*/ } } std::string s(n, 'R'); for (int i = 0; i < n; i++) s[i] = tree.query(1, 0, n, i) % 2 ? 'R' : 'B'; craft(s); return 1; }

Compilation message (stderr)

gift.cpp: In function 'int construct(int, int, std::vector<int>, std::vector<int>, std::vector<int>)':
gift.cpp:89:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |     for (int i = 0; i < a.size(); i++) //update single color
      |                     ~~^~~~~~~~~~
gift.cpp:105:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  105 |     for (int i = 0; i < a.size(); i++) //check wetherpossible
      |                     ~~^~~~~~~~~~
#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...