이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
// CF template, version 3.0
#include <bits/stdc++.h>
using namespace std;
#define improvePerformance ios_base::sync_with_stdio(false); cin.tie(0)
#define getTest int t; cin >> t
#define eachTest for (int _var=0;_var<t;_var++)
#define get(name) int (name); cin >> (name)
#define out(o) cout << (o)
#define getList(cnt, name) vector<int> (name); for (int _=0;_<(cnt);_++) { get(a); (name).push_back(a); }
#define sortl(name) sort((name).begin(), (name).end())
#define rev(name) reverse((name).begin(), (name).end())
#define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
#define decision(b) if (b){out("YES");}else{out("NO");}
#define int long long int
template <typename T, typename I>
struct segtree {
int n;
vector<T> tree;
vector<I> initial;
T id;
segtree(int i_n, vector<I> i_initial, T i_id): n(i_n), initial(i_initial), id(i_id) {
tree.resize(4 * n);
}
T conquer(T left, T right) {
// write your conquer function
}
T value(I inp) {
// write your value function
}
void build(int v, int l, int r) {
if (l == r) tree[v] = value(initial[l]);
else {
int middle = (l + r) / 2;
build(2 * v, l, middle);
build(2 * v + 1, middle + 1, r);
tree[v] = conquer(tree[2 * v], tree[2 * v + 1]);
}
}
void upd(int v, int l, int r, int i, I x) {
if (l == r) tree[v] = value(x);
else {
int middle = (l + r) / 2;
if (middle >= i) upd(2 * v, l, middle, i, x);
else upd(2 * v + 1, middle + 1, r, i, x);
tree[v] = conquer(tree[2 * v], tree[2 * v + 1]);
}
}
T query(int v, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) return tree[v];
else if (r < ql || qr < l) return id;
int middle = (l + r) / 2;
T left = query(2 * v, l, middle, ql, qr);
T right = query(2 * v + 1, middle + 1, r, ql, qr);
return conquer(left, right);
}
};
// vector<int>
signed main() {
improvePerformance;
//getTest;
//eachTest {
// only solves the path case.
get(n);
get(s);
int ors = s;
vector<vector<int>> pathst;
vector<int> cur;
forto(n, i) {
get(x);
get(p);
if (p == 0 && i) {
pathst.push_back(cur);
cur.clear();
}
cur.push_back(x);
}
pathst.push_back(cur);
vector<vector<int>> pathsnx;
for (vector<int> path: pathst) {
bool sign = false; // negative
bool activated = false;
int count = 0;
vector<int> newpath;
for (int x: path) {
if (activated) {
if (x < 0 && sign) {
sign = false;
newpath.push_back(count);
count = 0;
} else if (x > 0 && !sign) {
sign = true;
newpath.push_back(count);
count = 0;
}
count += x;
}
if (x < 0 && !activated) {
activated = true;
count += x;
} else if (!activated) {
s += x;
}
}
if (sign) newpath.push_back(count);
if (!newpath.empty()) pathsnx.push_back(newpath);
}
vector<vector<pair<int, int>>> paths;
for (vector<int> path: pathsnx) {
int minbal = 0;
int bal = 0;
vector<pair<int, int>> newpath;
for (int x: path) {
bal += x;
minbal = min(minbal, bal);
if (bal > 0) {
newpath.push_back({minbal, bal});
minbal = 0;
bal = 0;
}
}
rev(newpath);
paths.push_back(newpath);
}
priority_queue<array<int, 3>> pq;
int sz = paths.size();
forto(sz, i) if (!paths[i].empty()) pq.push({paths[i].back().first, paths[i].back().second, i});
while (!pq.empty()) {
auto top = pq.top();
int needed = -top[0];
if (needed > s) break;
s += top[1];
int ind = top[2];
pq.pop();
paths[ind].pop_back();
if (!paths[ind].empty()) pq.push({paths[ind].back().first, paths[ind].back().second, ind});
}
out(s - ors);
//}
}
컴파일 시 표준 에러 (stderr) 메시지
Main.cpp: In function 'int main()':
Main.cpp:10:23: warning: unnecessary parentheses in declaration of 'n' [-Wparentheses]
10 | #define get(name) int (name); cin >> (name)
| ^
Main.cpp:77:9: note: in expansion of macro 'get'
77 | get(n);
| ^~~
Main.cpp:10:23: warning: unnecessary parentheses in declaration of 's' [-Wparentheses]
10 | #define get(name) int (name); cin >> (name)
| ^
Main.cpp:78:9: note: in expansion of macro 'get'
78 | get(s);
| ^~~
Main.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
| ^
Main.cpp:82:9: note: in expansion of macro 'forto'
82 | forto(n, i) {
| ^~~~~
Main.cpp:10:23: warning: unnecessary parentheses in declaration of 'x' [-Wparentheses]
10 | #define get(name) int (name); cin >> (name)
| ^
Main.cpp:83:13: note: in expansion of macro 'get'
83 | get(x);
| ^~~
Main.cpp:10:23: warning: unnecessary parentheses in declaration of 'p' [-Wparentheses]
10 | #define get(name) int (name); cin >> (name)
| ^
Main.cpp:84:13: note: in expansion of macro 'get'
84 | get(p);
| ^~~
Main.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
| ^
Main.cpp:140:9: note: in expansion of macro 'forto'
140 | forto(sz, i) if (!paths[i].empty()) pq.push({paths[i].back().first, paths[i].back().second, i});
| ^~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |