:arrow_plus: Upload the memories
This commit is contained in:
		| @@ -31,4 +31,8 @@ add_executable(Playground | |||||||
|         csp-awarding/main.cc |         csp-awarding/main.cc | ||||||
|         holiday-plan/main.cc |         holiday-plan/main.cc | ||||||
|         bears-fruit-basket/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) | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								logical-expressions/data.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								logical-expressions/data.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | 0&(1|0)|(1|1|1&0) | ||||||
							
								
								
									
										91
									
								
								logical-expressions/main.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								logical-expressions/main.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | |||||||
|  | #include <iostream> | ||||||
|  | #include <stack> | ||||||
|  | #include <vector> | ||||||
|  |  | ||||||
|  | using namespace std; | ||||||
|  |  | ||||||
|  | string expr; | ||||||
|  |  | ||||||
|  | vector<char> expr_builder; | ||||||
|  | stack<char> 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<int> 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); | ||||||
|  | } | ||||||
							
								
								
									
										9
									
								
								processing-parts/data.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								processing-parts/data.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | 3 2 6 | ||||||
|  | 1 2 | ||||||
|  | 2 3 | ||||||
|  | 1 1 | ||||||
|  | 2 1 | ||||||
|  | 3 1 | ||||||
|  | 1 2 | ||||||
|  | 2 2 | ||||||
|  | 3 2 | ||||||
							
								
								
									
										60
									
								
								processing-parts/main.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								processing-parts/main.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | |||||||
|  | #include <iostream> | ||||||
|  | #include <cstring> | ||||||
|  |  | ||||||
|  | using namespace std; | ||||||
|  |  | ||||||
|  | const int MAXN = 10005; | ||||||
|  |  | ||||||
|  | vector<int> 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<pair<int, int>> 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; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										53
									
								
								trip-bus/main.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								trip-bus/main.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | |||||||
|  | #include <iostream> | ||||||
|  | #include <vector> | ||||||
|  | #include <queue> | ||||||
|  | #include <cstring> | ||||||
|  |  | ||||||
|  | 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<pair<int, int>> 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<node> 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; | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user