diff --git a/CMakeLists.txt b/CMakeLists.txt index fd4135c..e97679f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,4 +31,8 @@ add_executable(Playground csp-awarding/main.cc holiday-plan/main.cc bears-fruit-basket/main.cc - pre-sum/main.cc) + pre-sum/main.cc + trip-bus/main.cc + processing-parts/main.cc + logical-expressions/main.cc + logical-expressions/main.cc) diff --git a/logical-expressions/data.in b/logical-expressions/data.in new file mode 100644 index 0000000..f7d4402 --- /dev/null +++ b/logical-expressions/data.in @@ -0,0 +1 @@ +0&(1|0)|(1|1|1&0) diff --git a/logical-expressions/main.cc b/logical-expressions/main.cc new file mode 100644 index 0000000..74d88c2 --- /dev/null +++ b/logical-expressions/main.cc @@ -0,0 +1,91 @@ +#include +#include +#include + +using namespace std; + +string expr; + +vector expr_builder; +stack op_builder; + +void in_order2post_order() { + for (char ele: expr) { + if (ele == '0' || ele == '1')expr_builder.push_back(ele); + else if (ele == '(')op_builder.push(ele); + else if (ele == ')') { + while (!op_builder.empty() && op_builder.top() != '(') { + expr_builder.push_back(op_builder.top()); + op_builder.pop(); + } + op_builder.pop(); + } else if (ele == '&') { + while (!op_builder.empty() && op_builder.top() == '&') { + expr_builder.push_back(op_builder.top()); + op_builder.pop(); + } + op_builder.push('&'); + } else if (ele == '|') { + while (!op_builder.empty() && op_builder.top() != '(') { + expr_builder.push_back(op_builder.top()); + op_builder.pop(); + } + op_builder.push('|'); + } + } + while (!op_builder.empty()) { + expr_builder.push_back(op_builder.top()); + op_builder.pop(); + } +} + +const int N = 1e6 + 5; + +struct node { + int v, left, right; +} ast[N]; + +int plant_tree() { + int idx = 0; + stack st; + for (auto item: expr_builder) { + if (isdigit(item)) { + ast[++idx] = {item - '0', -1, -1}; + st.push(idx); + } else { + int right = st.top(); + st.pop(); + int left = st.top(); + st.pop(); + ast[++idx] = {(item == '&' ? 2 : 3), left, right}; + st.push(idx); + } + } + return idx; +} + +int short_circuit_and = 0, short_circuit_or = 0; + +int calc(int start) { + // Digit + if (ast[start].v == 0 || ast[start].v == 1) return ast[start].v; + // Operator + int left = calc(ast[start].left); + if (left == 0 && ast[start].v == 2) { // AND operator + short_circuit_and++; + return 0; + } else if (left == 1 && ast[start].v == 3) { // OR operator + short_circuit_or++; + return 1; + } + int right = calc(ast[start].right); + return right; +} + +int main() { + cin >> expr; + in_order2post_order(); + int start = plant_tree(); + cout << calc(start) << endl; + printf("%d %d\n", short_circuit_and, short_circuit_or); +} \ No newline at end of file diff --git a/processing-parts/data.in b/processing-parts/data.in new file mode 100644 index 0000000..cbc6493 --- /dev/null +++ b/processing-parts/data.in @@ -0,0 +1,9 @@ +3 2 6 +1 2 +2 3 +1 1 +2 1 +3 1 +1 2 +2 2 +3 2 diff --git a/processing-parts/main.cc b/processing-parts/main.cc new file mode 100644 index 0000000..0ad51ed --- /dev/null +++ b/processing-parts/main.cc @@ -0,0 +1,60 @@ +#include +#include + +using namespace std; + +const int MAXN = 10005; + +vector graph[MAXN]; +bool visited[MAXN]; +int dis_odd[MAXN], dis_even[MAXN]; + +void find_shortest_path() { + memset(dis_even, 0x3f, sizeof dis_even); + memset(dis_odd, 0x3f, sizeof dis_odd); + queue> q; + for (int &i: graph[1]) { + dis_odd[i] = 1; + q.emplace(i, 1); + } + while (!q.empty()) { + int x = q.front().first, y = q.front().second; + for (int &i: graph[x]) { + if (y % 2 == 0) { + if (y + 1 < dis_odd[i]) { + dis_odd[i] = y + 1; + q.emplace(i, y + 1); + } + } else { + if (y + 1 < dis_even[i]) { + dis_even[i] = y + 1; + q.emplace(i, y + 1); + } + } + } + q.pop(); + } +} + +int main() { + int n, m, q; + cin >> n >> m >> q; + for (int i = 0; i < m; i++) { + int u, v; + cin >> u >> v; + graph[u].push_back(v); + graph[v].push_back(u); + } + find_shortest_path(); + while (q--) { + int u, v; + cin >> u >> v; + if (v % 2 == 0) { + if (dis_even[u] > v) cout << "No" << endl; + else cout << "Yes" << endl; + } else { + if (dis_odd[u] > v) cout << "No" << endl; + else cout << "Yes" << endl; + } + } +} \ No newline at end of file diff --git a/trip-bus/main.cc b/trip-bus/main.cc new file mode 100644 index 0000000..2fa15c4 --- /dev/null +++ b/trip-bus/main.cc @@ -0,0 +1,53 @@ +#include +#include +#include +#include + +using namespace std; + +int dp[10005][105]; +bool visited[10005][105]; + +struct node { + node(int i, int i1, int i2) { + this->u = i; + this->idx = i1; + this->d = i2; + } + + int u, idx, d; + + bool operator<(const node &other) const { + return d > other.d; + } +}; + +vector> graph[10005]; + +int main() { + int n, m, k; + cin >> n >> m >> k; + for (int i = 0; i < m; i++) { + int u, v, a; + cin >> u >> v >> a; + graph[u].emplace_back(v, a); + } + memset(dp, 0x3f, sizeof dp); + priority_queue tasks; + tasks.emplace(1, 0, dp[1][0] = 0); + while (!tasks.empty()) { + int u = tasks.top().u; + int idx = tasks.top().idx; + tasks.pop(); + if (visited[u][idx]) continue; + else visited[u][idx] = true; + for (auto [v, w]: graph[u]) { + int time = dp[u][idx]; + int j = (idx + 1) % k; + if (time < w) time += (w - time + k - 1) / k * k; + if (dp[v][j] > time + 1) tasks.emplace(v, j, dp[v][j] = time + 1); + } + } + if (dp[n][0] == 0x3f3f3f3f) dp[n][0] = 1; + cout << dp[n][0] << endl; +} \ No newline at end of file