lOMoARcPSD| 61601590
Contents
CBUS ............................................................................................................................................................................................... 2
Balanced Courses Assignments ..................................................................................................................................................... 3
Count Integer Soluons ................................................................................................................................................................. 4
Disjoint Segment ............................................................................................................................................................................ 5
Inversion ......................................................................................................................................................................................... 5
Max-Distance Sub-Sequence ......................................................................................................................................................... 6
Gold Mining .................................................................................................................................................................................... 7
Max Even Subsequence ................................................................................................................................................................. 8
Nurse .............................................................................................................................................................................................. 9
Warehouse ..................................................................................................................................................................................... 9
Bridges .......................................................................................................................................................................................... 10
Bus Inner City ............................................................................................................................................................................... 11
Make Span Schedule .................................................................................................................................................................... 13
Strongly Connected Components ................................................................................................................................................ 13
Telco data check & query ............................................................................................................................................................. 14
Maze ............................................................................................................................................................................................. 15
Range Minimum Query ................................................................................................................................................................ 16
Largest black subrectangle ........................................................................................................................................................... 17
Max-Distance Sub-Sequence ....................................................................................................................................................... 18
Cut Material.................................................................................................................................................................................. 19
Max Matching on Bipare Graph ................................................................................................................................................ 20
Pair of equal items in a sequence ................................................................................................................................................ 21
Quàtặngsữa .................................................................................................................................................................................. 21
Truymkhobáu ............................................................................................................................................................................. 22
Given a sequence of n integers a0,. . .,an-1. We denote rmq(i,j) the minimum element of the
sequence ai, ai+1, . . .,aj. Given m pairs (i1, j1),. . .,(im, jm), compute the sum Q = rmq(i1,j1) + . . .
+ rmq(im, jm) ............................................................................................................................................................................... 22
Find Husband................................................................................................................................................................................ 23
Longest Increasing subsequence ................................................................................................................................................. 24
Longest Common Subsequence ................................................................................................................................................... 24
Hunng_dog ................................................................................................................................................................................. 25
Convert hh:mm:ss to seconds ...................................................................................................................................................... 26
Binary sequence generaon ........................................................................................................................................................ 26
Binary sequences generaon without consecuve 11 ............................................................................................................... 26
Count number of sudoku soluons ............................................................................................................................................. 27
Permutaon generaon ............................................................................................................................................................... 28
Family Tree ................................................................................................................................................................................... 28
WATER JUGS ................................................................................................................................................................................. 29
Hamiton Cycle .............................................................................................................................................................................. 30
List order of nodes visited by a DFS ............................................................................................................................................. 31
Minimum Spanning Tree - Kruskal ............................................................................................................................................... 32
Sequence of nodes visited by BFS ............................................................................................................................................... 33
All pair shortest paths .................................................................................................................................................................. 33
Max Flow ...................................................................................................................................................................................... 34
Shortest Path between 2 nodes on a directed graph with non-negave weights ..................................................................... 36
Bank Transacon .......................................................................................................................................................................... 37
Analyze Code Submission of a Programming Contest ................................................................................................................ 38
lOMoARcPSD| 61601590
Cizen Data Analysis .................................................................................................................................................................... 39
Longest Path on a Tree .................................................................................................................................................................. 41
Problem: Sum of length of paths from root on a tree .................................................................................................................. 42
bank_money_transfer .................................................................................................................................................................. 42
Given a sequence of disnct integers a1, a2, . . ., an . Compute the number P of triples of disnct
indices (i, j, k) such that among 3 items ai, aj , ak there is an item which is equal to the sum of 2
remaining items ............................................................................................................................................................................ 43
Aer parity lis ............................................................................................................................................................................... 43
stone_castle .................................................................................................................................................................................. 44
CBUS_UPPER_BOUND_CSTR_LENGTH_PICKUP_DROPOFF .......................................................................................................... 45
Compute C_k_n ............................................................................................................................................................................ 46
Check Parenthesis ........................................................................................................................................................................ 47
Equal to the sum of 2 remaining items ....................................................................................................................................... 47
chuyển n túi ền từ trụ sở chính ................................................................................................................................................. 48
CBUS
#include <bits/stdc++.h> using
namespace std ;
int n, K, load,x[10000], Fmin = 99999999, F = 0,M[1000][1000],Cmin=999999 ; bool visited[10000] ;
bool check(int v) { if(visited[v] == true) return false ; if(v>n) { if(visited[v-n]==false) { return false ;
}
}
else if(load+ 1 > K) return false
; return true ;
}
void updateBest() {
Fmin = min(Fmin,M[x[2*n]][0]+F) ; return ;
}
void Try(int k){ for(int v = 1 ; v<=2*n; v++) {
if(check(v)){ x[k] = v ; visited[v] = true
; if(v<=n) { load ++ ;
}
else { load-- ;
}
F += M[x[k-1]][x[k]] ; if(k==2*n)
{ updateBest() ;
}
else if(F+(2*n-k)*Cmin<Fmin) {
Try(k+1);
}
F-= M[x[k-1]][x[k]] ;
visited[x[k]] = false ;
if(v<=n) { load-- ;
} else
load++ ;
}
}
}
int main() { memset(x,0, sizeof(x)) ;
memset(visited, false, sizeof(visited)); load = 0 ;
cin>>n>>K ;
for(int i =0 ; i<= 2*n ;i++ ) { for(int j = 0 ; j <=
2*n ; j++) { cin>>M[i][j] ;
lOMoARcPSD| 61601590
if(i!=j) {
Cmin=min(M[i][j],Cmin) ;
}
}
}
x[0] = 0 ; visited[0] =
true ; Try(1) ;
cout<<Fmin ;
}
Balanced Courses Assignments
#include <bits/stdc++.h> using
namespace std; int m, n, k;
vector<vector<int>>favor; bool
conict[31][31]; vector<int>load;
vector<vector<int>>assigned; int ans =
INT_MAX; bool is_valid(int teacher, int
course)
{
if(nd(favor[teacher].begin(), favor[teacher].end(), course + 1) == favor[teacher].end()) return false;
for(int i = 0; i< assigned[teacher].size(); i++)
{
if(conict[course][assigned[teacher][i]]) return false;
}
return true;
}
void Try(int index)
{
if(index == n)
{
int max_load_curr = *max_element(load.begin(), load.end()); ans = min(ans,
max_load_curr); return;
}
for(int teacher = 0; teacher < m; teacher++)
{
if(is_valid(teacher, index) && load[teacher] + 1 <= ans)
{
load[teacher]++;
assigned[teacher].push_back(index); Try(index +
1); load[teacher]--;
assigned[teacher].pop_back();
}
}
}
int main() { cin>>
m >>n;
favor.resize(m); load.resize(m,
0); assigned.resize(m); for(int i
= 0; i< m; i++)
{ int
k;
cin>>k;
lOMoARcPSD| 61601590
favor[i].resize(k);
for(int j = 0; j < k; j++)
{
cin>> favor[i][j];
}
}
cin>>k;
memset(conict, false, sizeof(conict)); for(int i = 0; i< k;
i++)
{
int temp1, temp2;
cin>> temp1 >>temp2;
conict[temp1 - 1][temp2 - 1] = true;
conict[temp2 - 1][temp1 - 1] = true;
} Try(0);
if (ans == INT_MAX) {
cout<< -1 <<endl;
} else {
cout<<ans<<endl;
}
return 0;
}
Count Integer Soluons
#include <iostream> using
namespace std; int n, m,
a[1000];
int countSoluons(int currentSum, int index) { //
Nếutổnghiệntibằng M, cómộtnghiệmmthấy if
(currentSum == m) { return 1; }
// Nếutổnghiệntạilớnhơn M hoặcđãkiểmtrahếtcáchệsố
if (currentSum> m || index >= n) { return 0;
} int totalWays = 0;
for (int x = 0; currentSum + a[index] * x <= m; x++) {
totalWays += countSoluons(currentSum + a[index] * x, index + 1);
}
return totalWays;
}
int main() {
cin>> n >>m;
for (int i = 0; i< n; i++) { cin>> a[i];
}
int result = countSoluons(0, 0); cout<< result
<<endl;
return 0;
}
lOMoARcPSD| 61601590
Disjoint Segment
#include <bits/stdc++.h> using
namespace std;
struct Edge {
int start, end;
Edge(int s = 0, int e = 0) : start(s), end(e) {}
};
int disjoint_sets(vector<Edge>&arr) { int n =
arr.size();
sort(arr.begin(), arr.end(), [](Edge a, Edge b) { return
a.end<b.end;
});
int res = 1; int last_end =
arr[0].end;
for(int i = 0; i< n; i++) {
if(arr[i].start>last_end) { res++;
last_end = arr[i].end;
} }
return res;
}
int main() {
int n; cin>>n;
vector<Edge>arr(n); for(int i =
0; i< n; i++) {
cin>>arr[i].start>>arr[i].end;
}
cout<<disjoint_sets(arr); return 0;
}
Inversion
#include<bits/stdc++.h> using
namespace std;
const int MOD = 1e9 + 7; // Hằng sốchophéplấykếtquả modulo
// Hàmđểhợpnhấthaimảng con vàđếmsốlượngđảongược long
longmerge_and_count(vector<int>&arr, int le, int mid, int right) { int n1 = mid - le +
1; int n2 = right - mid;
vector<int> L(n1), R(n2); for
(int i = 0; i< n1; i++) L[i] =
arr[le + i]; for (int j = 0; j < n2;
j++) R[j] = arr[mid + 1 + j];
long long count = 0; int i =
0, j = 0, k = le;
while (i< n1 && j < n2) {
if (L[i] <= R[j]) { arr[k++] = L[i++];
} else {
count += (n1 - i); // Đếmsốđảongược arr[k++] = R[j++];
}
}
lOMoARcPSD| 61601590
while (i< n1) arr[k++] = L[i++]; while (j < n2)
arr[k++] = R[j++];
return count % MOD; }
// Hàmđệquy merge sort vàđếảongược
long longmerge_sort_and_count(vector<int>&arr, int le, int right) { long long
count = 0; if (le < right) {
int mid = le + (right - le) / 2;
count += merge_sort_and_count(arr, le, mid); count +=
merge_sort_and_count(arr, mid + 1, right);
count += merge_and_count(arr, le, mid, right);
}
return count % MOD;
}
int main() {
int n;
cin>> n; // Nhậpslượngphầntử vector<int>arr(n);
for (int i = 0; i< n; i++) {
cin>>arr[i]; // Nhậpdãysố
}
long long result = merge_sort_and_count(arr, 0, n - 1); // Tínhsốđảongược cout<< result
<<endl; // Xuấtkếtquả return 0;
}
Max-Distance Sub-Sequence
#include <iostream> #include
<vector> #include <algorithm>
using namespace std;
// Hàmkiểmtraxemcóthểđặt C phầntửvớikhoảngcáchtốithiểulàdist hay không bool
canPlaceCows(const vector<int>& posions, int n, int c, int dist) { int count = 1; //
Đếmsphntửđãđặt
int last_posion = posions[0]; // Vịtrícủaphầntửđãđặtcuốicùng for (int i = 1; i<
n; i++) {
// Nếukhoảngcáchtừphnthintạiđếnphầntửđãđặtcuốicùng>= dist if
(posions[i] - last_posion>= dist) { count++; // Đặtphầntửmới
last_posion = posions[i]; // Cậpnhậtvịtríđãđặt
}
if (count == c) return true; // Nếuđãđặủ C phầnt
}
return false; // Khôngthểđặủ C phầntử }
// Hàmmkhoảngcáchtốithiểulớnnhất
int ndMaxDistance(vector<int>& posions, int n, int c) {
sort(posions.begin(), posions.end()); // Sắpxếpcácvịtrí int le = 1; //
Khoảngcáchnhỏnhấtcóthể
int right = posions[n - 1] - posions[0]; // Khoảngcáchlớnnhấtcóthể int result = 0;
while (le <= right) {
int mid = le + (right - le) / 2; // Khoảngcáchthửnghiệm //
Kiểmtraxemcóthểđặt C phầntửvớikhoảngcách mid hay không if
lOMoARcPSD| 61601590
(canPlaceCows(posions, n, c, mid)) { result = mid; // Cậpnhậtkếtquả
le = mid + 1; // Tăngkhoảngcách
} else {
right = mid - 1; // Giảmkhoảngcách
}
}
return result; // Trảvềkhoảngcáchtốiđamđược
}
int main() {
int t;
cin>> t; // Nhậpslượng test cases while (t--) {
int n, c;
cin>> n >> c; // Nhập N và C vector<int>
posions(n);
for (int i = 0; i< n; i++) {
cin>> posions[i]; // Nhập các vịtrí
}
// Tìmkhoảngcáchtốithiểulớnnhất int result =
ndMaxDistance(posions, n, c); cout<< result <<endl; //
Xutkếtquả
}
return 0;
}
Gold Mining
#include <bits/stdc++.h> using
namespace std;
int main() {
int n, L1, L2;
cin>> n >> L1 >>L2;
vector<int> a(n), dp(n); for (int i = 0; i< n;
++i) cin>> a[i];
// Khởitạo deque đểlưutrữcácchỉsốcủadp
deque<int>dq; long longmax_gold = 0;
for (int i = 0; i< n; ++i) {
// Xóacácphntửkhôngcầnthiếrong deque while
(!dq.empty() &&dp[dq.back()] <= dp[i - L1]) { dq.pop_back();
}
// Thêmchỉsốcủadp[i - L1] vào deque
if (i - L1 >= 0) {
dq.push_back(i - L1);
}
// Xóaphầntửđầuêntrong deque nếunórangoàikhoảng [i - L2] while
(!dq.empty() &&dq.front() <i - L2) { dq.pop_front();
}
// Tính giá trịdp[i] if
(!dq.empty()) { dp[i] =
dp[dq.front()] + a[i];
} else {
dp[i] = a[i]; // Nếukhôngcóphầntử nào trong deque
lOMoARcPSD| 61601590
}
max_gold = ((max_gold>dp[i]) ?max_gold : dp[i]);
}
cout<<max_gold<<endl;
return 0;
}
Max Even Subsequence
#include <bits/stdc++.h> using
namespace std;
int main() { ios_base::sync_with_stdio(0);
cin.e(0);
int n; cin>>n;
long long sum = 0; long longmaxEven =
LLONG_MIN; long longminEven = 0;
long longmaxOdd = LLONG_MIN; long
longminOdd = LLONG_MAX; bool hasEven
= false;
for(int i = 0; i< n; i++) {
int x;
cin>>x;
sum += x;
if(sum % 2 == 0) {
maxEven = max(maxEven, sum - minEven); minEven =
min(minEven, sum);
hasEven = true;
} else {
if(minOdd != LLONG_MAX) { maxEven =
max(maxEven, sum - minOdd);
}
if(maxOdd != LLONG_MIN) { maxEven = max(maxEven,
sum - maxOdd);
}
maxOdd = max(maxOdd, sum);
minOdd = min(minOdd, sum);
}
}
if(!hasEven&&maxEven == LLONG_MIN) { cout<<
"NOT_FOUND\n";
} else {
cout<<maxEven<< "\n";
}
return 0;
}
lOMoARcPSD| 61601590
Nurse
#include<bits/stdc++.h> using
namespace std; const int MOD =
1e9 + 7;
int main() {
int n, K1, K2;
cin>> n >> K1 >>K2;
// Khởitạomảng f
vector<vector<long long>>f(n + 1, vector<long long>(2, 0));
// Cơsở
f[0][0] = 1; // 1 cáchđểkhônglàmgìtrong 0 ngày f[0][1] = 1; //
Khôngcócáchnàođểlàmviệctrong 0 ny
for (int i = 1; i<= n; ++i) { // Tính
f[i][0]: ngàynghỉ f[i][0] = f[i - 1][1];
// Tính f[i][1]: ngàykếhúccủamợtlàmviệc for (int
j = K1; j <= K2; ++j) { if (i - j >= 0) {
f[i][1] = (f[i][1] + f[i - j][0]) % MOD;
}
}
}
// Kếtquảlàtổngsốcáchlậplịchcho N ngày long long
result = (f[n][0] + f[n][1]) % MOD;
cout<< result <<endl;
return 0;
}
Warehouse
#include <bits/stdc++.h> using
namespace std;
const int MAXN = 1000; const int
MAXT = 100; const int MOD = 1e9
+ 7;
int main() {
int N, T, D;
cin>> N >> T >>D;
vector<int> a(N), t(N);
for (int i = 0; i< N; ++i) cin>> a[i]; for (int i = 0;
i< N; ++i) cin>> t[i];
// DP table to track max goods collected vector<vector<int>>dp(N, vector<int>(T +
1, 0));
// Inialize starng DP values for (int
i = 0; i< N; ++i) { if (t[i] <= T) dp[i][t[i]]
= a[i];
}
int max_goods = 0;
lOMoARcPSD| 61601590
// DP transions for (int i = 0; i< N;
++i) { for (int j = 0; j <= T; ++j) {
if (dp[i][j] == 0) connue;
// Transion from staon i to i + d (1 <= d <= D) for (int d
= 1; d <= D; ++d) { int next_staon = i + d; if
(next_staon>= N) break;
int next_me = j + t[next_staon]; if
(next_me<= T) {
dp[next_staon][next_me] = max(dp[next_staon][next_me], dp[i][j] + a[next_staon]); max_goods =
max(max_goods, dp[next_staon][next_me]);
}
}
}
}
cout<<max_goods<<endl;
return 0;
}
Bridges
#include <iostream> #include
<vector>
#include <algorithm>
#include <set> using
namespace std;
class Graph { public:
Graph(int verces); void addEdge(int u, int v);
void ndArculaonPointsAndBridges(); private:
void dfs(int u, int parent); int V; //
Sốđỉnh
vector<vector<int>> adj; // Danh sáchkề vector<int>
disc, low; vector<bool>visited;
set<int>arculaonPoints; vector<pair<int,
int>>bridges;
int me; };
Graph::Graph(int verces) {
V = verces; adj.resize(V + 1);
disc.resize(V + 1); low.resize(V
+ 1); visited.resize(V + 1);
me = 0;
}
void Graph::addEdge(int u, int v) {
adj[u].push_back(v); adj[v].push_back(u);
}
void Graph::dfs(int u, int parent) {
visited[u] = true; disc[u] = low[u]
= ++me; int children = 0;
for (int v : adj[u]) { if (!visited[v]) {
children++; dfs(v, u); low[u] =
min(low[u], low[v]);
lOMoARcPSD| 61601590
// Điềukiệnchođiểmct
if (parent != -1 && low[v] >= disc[u]) { arculaonPoints.insert(u);
}
// Điềukiệnchocầu if
(low[v] > disc[u]) {
bridges.push_back({u, v});
}
} else if (v != parent) { low[u] =
min(low[u], disc[v]);
}
}
// Gốccủa DFS
if (parent == -1 && children > 1) { arculaonPoints.insert(u);
}
}
void Graph::ndArculaonPointsAndBridges() { for (int i = 1;
i<= V; ++i) {
if (!visited[i]) {
dfs(i, -1);
}
}
cout<<arculaonPoints.size() << " " <<bridges.size() <<endl;
}
int main() { int
N, M;
cin>> N >>M;
Graph g(N);
for (int i = 0; i< M; ++i) {
int u, v;
cin>> u >>v;
g.addEdge(u, v);
}
g.ndArculaonPointsAndBridges();
return 0;
}
Bus Inner City
#include <bits/stdc++.h>
#dene FOR(i, x, y) for(int i = x; i<= y; i++) using namespace
std;
int n, m; // Sốthànhphốvàsốđườngkếtnối long longcost[5001], maxCies[5001]; // Chi
phívàsốthànhphốtốiđamàtuyếnbuýtcóthểđi long longdp[5001][5001]; // Mảnglưu chi phítốithiểu
vector<int>graph[5001]; // Đồthbiểudiễncácthànhphốvàcácđườngnối
// Định nghĩachocáckiểudữliệểsửdụngtronghàngđợiưuên typedef
pair<long long, long long>CostPair; typedef pair<CostPair, int>State;
priority_queue<State, vector<State>, greater<State>>pq; // Hàngđợiưuên
long longndMinimumCost(int start, int nish) {
lOMoARcPSD| 61601590
// Khởitạomảngdpvớigiátrịlớn
FOR(i, 1, n) {
FOR(j, 0, n) {
dp[i][j] = LLONG_MAX; // Sửdụng LLONG_MAX đểđạidiệnchovôcùng
}
}
dp[start][maxCies[start]] = cost[start]; // Chi phíkhibutừthànhphốbắu
pq.push(State(CostPair(dp[start][maxCies[start]], maxCies[start]), start));
while (!pq.empty()) {
int currentCity = pq.top().second; long
longcurrentCost = pq.top().rst.rst; int
remainingCies = pq.top().rst.second; pq.pop();
// Kiểmtraxem chi phíhiệntạicótươngứngvớigiátrị trong dpkhông if
(currentCost != dp[currentCity][remainingCies]) connue;
// Nếuđãđếnthànhphốđích, trảvề chi phí if
(currentCity == nish) return currentCost;
// Duyệt qua cácthànhphố lân cận for (int
neighbor : graph[currentCity]) {
// Nếucònthànhphốđể đi if
(remainingCies> 0) {
// Cậpnhật chi phínếuđiđếnthànhphốlâncậnmàkhôngnhthêm chi phí if
(dp[neighbor][remainingCies - 1] >currentCost) { dp[neighbor][remainingCies - 1] = currentCost;
pq.push(State(CostPair(currentCost, remainingCies - 1), neighbor));
}
// Cậpnhật chi phínếulênxebuýtmới
if (dp[neighbor][maxCies[neighbor]] > currentCost + cost[neighbor]) {
dp[neighbor][maxCies[neighbor]] = currentCost + cost[neighbor];
pq.push(State(CostPair(currentCost + cost[neighbor], maxCies[neighbor]), neighbor));
}
}
}
}
return -1; // Nếukhôngmthấyđườngđiđếnthànhphốđích
}
int main() {
// Nhậpsốlượngthànhphốvàđườngkếtnối cin>> n >>m;
FOR(i, 1, n) {
cin>> cost[i] >>maxCies[i]; // Nhập chi phívàsốthànhphốtốiđachomỗituyếnbuýt
}
// Nhậpcácđườngkếtnốigiữacácthànhphố
while (m--) { int
a, b;
cin>> a >>b;
graph[a].push_back(b);
graph[b].push_back(a); // Đồthịvôhướng
}
// Tìm chi phítốithiểđitừthànhphố 1 đếnthànhphố n cout<<ndMinimumCost(1, n);
return 0;
}
lOMoARcPSD| 61601590
Make Span Schedule
#include<bits/stdc++.h> using
namespace std;
int main() { int n,
m;
cin>> n >>m; vector<int> d(n+1);
for (int i = 1; i<= n; ++i) { cin>>
d[i];
}
vector<vector<int>> graph(n+1);
vector<int> bac (n+1, 0); for (int i = 0; i< m;
++i) {
int u, v;
cin>> u >>v; graph[u].push_back(v);
bac[v]++;
}
queue<int>q;
vector<int>compleon(n+1, 0); for (int i
= 1; i<= n; ++i) { if (bac[i] == 0) {
q.push(i);
compleon[i] = d[i];
}
}
while (!q.empty()) { int u =
q.front(); q.pop();
for (int neighbor : graph[u]) { bac[neighbor]--;
compleon[neighbor] = max(compleon[neighbor], compleon[u] +
d[neighbor]);
if (bac[neighbor] == 0) {
q.push(neighbor);
}
}
}
int res = 0;
for (int i = 1; i<= n; i++) { res = max(res,
compleon[i]);
} cout<< res <<endl;
return 0;
}
Strongly Connected Components
#include<bits/stdc++.h> using namespace std; void dfs(vector<vector<int>>& graph, vector<bool>& visited,
stack<int>&nishStack, int start) { visited[start] = true; for (int neighbor : graph[start]) { if (!visited[neighbor]) {
dfs(graph, visited, nishStack, neighbor);
}
}
nishStack.push(start);
}
void dfs_reverse(vector<vector<int>>&reverse_graph, vector<bool>& visited, int start) { visited[start] = true;
lOMoARcPSD| 61601590
for (int neighbor :reverse_graph[start]) { if (!visited[neighbor]) {
dfs_reverse(reverse_graph, visited, neighbor); }
}
}
int main() { int n,
m;
cin>> n >>m;
vector<vector<int>> graph(n+1);
vector<vector<int>>reverse_graph(n+1);
for (int i = 0; i< m; ++i) { int u, v;
cin>> u >>v; graph[u].push_back(v);
reverse_graph[v].push_back(u);
}
// dfs G
vector<bool> visited (n+1, false); stack<int>nishStack;
for(int i = 1; i<= n; i++) { if (!visited[i]) { dfs(graph,
visited, nishStack, i);
}
}
// dfs G_T
visited.assign(n+1, false); int cnt =
0;
while (!nishStack.empty()) { int u = nishStack.top();
nishStack.pop(); if(!visited[u]) {
dfs_reverse(reverse_graph, visited, u); cnt++;
}
} cout<<cnt<<endl;
return 0;
}
Telco data check & query
#include<bits/stdc++.h> using
namespace std;
struct CallLog { string
from_number; string
to_number; string date;
string from_me; string
end_me; };
// Hàmkiểmtranhhợplcủasđiệnthoại bool
isValidPhoneNumber(const string& number) { if
(number.size()!= 10) return false; for (int i = 0;
i<number.size(); i++) {
if (!(number[i] >= '0' && number[i] <= '9')) return false;
}
return true;
}
// Hàmnhtổngthờigiancuộcgọitheogiây
int calculateDuraon(const string& start, const string& end) { int startTime=
3600*((start[0]-'0')*10 + start[1]-'0')
lOMoARcPSD| 61601590
+ 60*((start[3]-'0')*10 + start[4]-'0') +
((start[6]-'0')*10 + start[7]-'0'); int endTime= 3600*((end[0]-
'0')*10 + end[1]-'0')
+ 60*((end[3]-'0')*10 + end[4]-'0') +
((end[6]-'0')*10 + end[7]-'0'); return endTime - startTime;
}
int main() { vector<CallLog>logs; unordered_map<string,
int>calls_from; unordered_map<string, long
long>total_me_from;
string line;
while (true) { getline(cin, line);
if (line == "#") break; if
(line.nd("call") == 0) { stringstream
ss(line);
string keyword, from_number, to_number, date, from_me, end_me; ss >> keyword
>>from_number>>to_number>> date >>from_me>>end_me; logs.push_back({from_number, to_number,
date, from_me, end_me}); calls_from[from_number]++;
total_me_from[from_number] += calculateDuraon(from_me, end_me);
} }
while (true) {
cin>>line;
if (line == "#") break;
if (line == "?check_phone_number") {
bool all_valid = true; for (const
auto&log : logs) {
if (!isValidPhoneNumber(log.from_number) || !isValidPhoneNumber(log.to_number)) { all_valid = false;
break;
}
}
cout<< (all_valid ?1 : 0) <<endl;
} else if (line == "?number_calls_from") { string
phone_number; cin>>phone_number;
cout<<calls_from[phone_number] <<endl;
} else if (line == "?number_total_calls") { cout<<logs.size() <<endl;
} else if (line == "?count_me_calls_from") { string
phone_number; cin>>phone_number;
cout<<total_me_from[phone_number] <<endl;
} }
return 0;
}
Maze
#include <bits/stdc++.h> using
namespace std;
int BFS(int n, int m, int r, int c, vector<vector<int>>& maze) {
// Các hướng di chuyển: lên, xuống, trái, phải
vector<pair<int, int>> direcons = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; queue<pair<int, int>>
q; // Queue đểlưutọộ q.push({r, c});
// Mảng 2 chiềukiểmtrađãghéthămchưa
lOMoARcPSD| 61601590
vector<vector<bool>>visited(n, vector<bool>(m, false)); visited[r][c] =
true; int steps = 0; // Đếmsớcđãđi
while (!q.empty()) {
int size = q.size();
steps++; // Tăngsốớcsaumỗilầnlặp
for (int i = 0; i< size; ++i) { int
x = q.front().rst; int y =
q.front().second; q.pop();
// Kiểmtranếuđãra biên
if (x == 0 || x == n - 1 || y == 0 || y == m - 1) { return steps; //
Trảvềsốớc
}
// Kiểmtracác ô lâncận
for (pair<int, int>direcon : direcons) { int
new_x = x + direcon.rst; int new_y = y +
direcon.second;
// Kiểmtraxem ô mớicóhợplệkhông
if (new_x>= 0 &&new_x< n &&new_y>= 0 &&new_y< m &&
maze[new_x][new_y] == 0 && !visited[new_x][new_y]) {
visited[new_x][new_y] = true; q.push({new_x, new_y});
}
}
}
}
// Nếukhôngmthấyđườngthoát return -1;
}
int main() {
int n, m, r, c;
cin>> n >> m >> r >>c;
r--; c--; // Chuyển sang chỉsố 0 vector<vector<int>>maze(n, vector<int>(m)); //
Sửdụng vector for (int i = 0; i< n; ++i) {
for (int j = 0; j < m; ++j) { cin>> maze[i][j];
}
}
cout<<BFS(n, m, r, c, maze) <<endl; return 0;
}
Range Minimum Query
#include <bits/stdc++.h> using
namespace std;
int main() {
int n, queries, i, j, sum = 0; cin>>n;
int a[n];
int maxLog = log2(n) + 1; // so hang cuamang 2 chieu int
b[n][maxLog];
for (int k = 0; k < n; k++) cin>> a[k];
// preprocessing for (int k = 0; k < n; k++) {
b[k][0] = k; // khoitao hang dauen
lOMoARcPSD| 61601590
}
// nhtoancac hang con lai for (int h = 1; (1 << h) <= n; h++) {
for (int k = 0; k + (1 << h) - 1 < n; k++) { if (a[b[k][h - 1]] < a[b[k +
(1 << (h - 1))][h - 1]]) { b[k][h] = b[k][h - 1];
} else {
b[k][h] = b[k + (1 << (h - 1))][h - 1];
}
}
}
// processing
cin>>queries;
while (queries--) { cin>>i>>j;
int range = (1 << (int)log2(j - i + 1)); // do dai moi khoang int column = (int)log2(j -
i + 1); // toa do theo cot trenmang 2 chieu
// m min trongcackhoang int minIndex1 = b[i][column];
int minIndex2 = b[j - range + 1][column]; int minValue =
min(a[minIndex1], a[minIndex2]);
sum += minValue;
}
cout<< sum <<endl;
return 0;
}
Largest black subrectangle
#include <bits/stdc++.h> using
namespace std;
// Hàmnhdiệnchlớnnhấrongmộtmảngchiềucao int
maxRectangleArea(int heights[], int m) { stack<int>s; int
maxArea = 0;
for (int j = 0; j <= m; j++) { int h = (j == m) ?0 :
heights[j]; while (!s.empty() && heights[s.top()] > h) {
int height = heights[s.top()]; s.pop();
int width = s.empty() ? j : j - s.top() - 1; maxArea =
max(maxArea, height * width);
}
s.push(j);
}
return maxArea;
}
int main() { int
n, m;
cin>> n >>m;
int matrix[n][m]; for (int i = 0; i< n;
i++) { for (int j = 0; j < m; j++) {
cin>> matrix[i][j];
}
}
// Tomảngchiềucao int
height[m];
for (int j = 0; j < m; j++) height[j] = 0; int maxArea
= 0;
lOMoARcPSD| 61601590
for (int i = 0; i< n; ++i) { for (int j
= 0; j < m; ++j) { //
Cậpnhậtchiềucao if (matrix[i][j]
== 1) { height[j]++; }
else { height[j] = 0;
}
}
// Tínhdiệnchlớnnhấtchohànghiệntại
maxArea = max(maxArea, maxRectangleArea(height, m));
}
cout<<maxArea<<endl;
return 0;
}
Max-Distance Sub-Sequence
#include <iostream> #include
<vector> #include <algorithm>
using namespace std;
// Hàmkiểmtraxemcóthểđặt C phầntửvớikhoảngcáchtốithiểulàdist hay không bool
canPlaceCows(const vector<int>& posions, int n, int c, int dist) { int count = 1; //
Đếmsphntửđãđặt
int last_posion = posions[0]; // Vịtrícủaphầntửđãđặtcuốicùng for (int i = 1; i<
n; i++) {
// Nếukhoảngcáchtừphnthintạiđếnphầntửđãđặtcuốicùng>= dist if
(posions[i] - last_posion>= dist) { count++; // Đặtphầntửmới
last_posion = posions[i]; // Cậpnhậtvịtríđãđặt
}
if (count == c) return true; // Nếuđãđặủ C phầnt
}
return false; // Khôngthểđặủ C phầntử }
// Hàmmkhoảngcáchtốithiểulớnnhất
int ndMaxDistance(vector<int>& posions, int n, int c) {
sort(posions.begin(), posions.end()); // Sắpxếpcácvịtrí int le = 1; //
Khoảngcáchnhỏnhấtcóthể
int right = posions[n - 1] - posions[0]; // Khoảngcáchlớnnhấtcóthể int result = 0;
while (le <= right) {
int mid = le + (right - le) / 2; // Khoảngcáchthửnghiệm //
Kiểmtraxemcóthểđặt C phầntửvớikhoảngcách mid hay không if
(canPlaceCows(posions, n, c, mid)) { result = mid; // Cậpnhậtkếtquả
le = mid + 1; // Tăngkhoảngcách
} else {
right = mid - 1; // Giảmkhoảngcách
}
}
return result; // Trảvềkhoảngcáchtốiđamđược
}
int main() {
int t;
cin>> t; // Nhậpslượng test cases while (t--) {
lOMoARcPSD| 61601590
int n, c;
cin>> n >> c; // Nhập N và C vector<int>
posions(n);
for (int i = 0; i< n; i++) {
cin>> posions[i]; // Nhập các vịtrí
}
// Tìmkhoảngcáchtốithiểulớnnhất int result =
ndMaxDistance(posions, n, c); cout<< result <<endl; //
Xutkếtquả
}
return 0;
}
Cut Material
#include<bits/stdc++.h> using
namespace std;
int height, width, n; int h[10], w[10], mark[10][10]; void doMark(int x,
int y, int xoay, int k, bool mark_value) { int wk = w[k]; int hk = h[k];
if (xoay == 1) {
swap(wk, hk);
}
for (int i = x; i<= x + wk -1; i++) { for (int j =
y; j <= y + hk -1; j++) {
mark[i][j] = mark_value;
}
}
}
bool check(int xoay, int x, int y, int k) { int wk =
w[k]; int hk = h[k]; if (xoay == 1) {
swap(wk, hk);
}
if (x + wk> width || y + hk> height) return false; for (int i =
x; i<= x + wk -1; i++) { for (int j = y; j <= y + hk - 1; j++) {
if (mark[i][j]) { return false;
}
} }
return true;
}
bool tryy(int k) { if
(k == n) { return
true;
}
for (int xoay = 0; xoay<= 1; xoay++) { int wk =
w[k]; int hk = h[k]; if (xoay == 1) {
swap(wk, hk);
}
for (int x = 0; x <= width - wk; x++) { for (int y =
0; y <= height - hk; y++) { if (check(xoay, x, y, k)) {
doMark(x, y, xoay, k, true);
lOMoARcPSD| 61601590
if (tryy(k + 1)) return true; doMark(x, y, xoay, k,
false);
}
}
} }
return false;
}
int main() { cin>> height
>>width; cin>>n;
for (int i = 0; i< n; i++) {
cin>> w[i] >> h[i];
}
if (tryy(0)) {
cout<< 1 <<endl;
} else {
cout<< 0 <<endl;
}
return 0;
}
Max Matching on Bipare Graph
#include <iostream> #include
<vector> #include <cstring>
using namespace std; const int
MAX_N = 10000;
vector<int>tasks[MAX_N + 1]; // Danh sáchnhiệmvchotừngnhânviên int staAssignment[MAX_N +
1]; // Mảnglưunhânviênđãđượcphâncôngchonhiệmvụ bool visited[MAX_N + 1]; //
Mảngđánhdấunhânviênđãđượcthăm
bool canAssign(int task) { for (int
sta : tasks[task]) {
if (!visited[sta]) {
visited[sta] = true; // Đánhdấunhânviênđã thăm //
Nếunhânviênchưađượcphâncônghoặccóthểphâncônglại if (staAssignment[sta] == 0 ||
canAssign(staAssignment[sta])) { staAssignment[sta] = task; // Phâncôngnhimvụcho nhân
viên
return true;
}
} } return
false;
}
int main() { int
n, m;
cin>> n >>m;
// Đọcnhiệmvụvànhânviêncóthểthựchiện
for (int i = 1; i<= n; ++i) { int k;
cin>> k; // Sốnhânviênchonhiệmvi
tasks[i].resize(k);
for (int j = 0; j < k; ++j) {

Preview text:

lOMoAR cPSD| 61601590 Contents
CBUS ............................................................................................................................................................................................... 2
Balanced Courses Assignments ..................................................................................................................................................... 3
Count Integer Solutions ................................................................................................................................................................. 4
Disjoint Segment ............................................................................................................................................................................ 5
Inversion ......................................................................................................................................................................................... 5
Max-Distance Sub-Sequence ......................................................................................................................................................... 6
Gold Mining .................................................................................................................................................................................... 7
Max Even Subsequence ................................................................................................................................................................. 8
Nurse .............................................................................................................................................................................................. 9
Warehouse ..................................................................................................................................................................................... 9
Bridges .......................................................................................................................................................................................... 10
Bus Inner City ............................................................................................................................................................................... 11
Make Span Schedule .................................................................................................................................................................... 13
Strongly Connected Components ................................................................................................................................................ 13
Telco data check & query ............................................................................................................................................................. 14
Maze ............................................................................................................................................................................................. 15
Range Minimum Query ................................................................................................................................................................ 16
Largest black subrectangle ........................................................................................................................................................... 17
Max-Distance Sub-Sequence ....................................................................................................................................................... 18
Cut Material.................................................................................................................................................................................. 19
Max Matching on Bipartie Graph ................................................................................................................................................ 20
Pair of equal items in a sequence ................................................................................................................................................ 21
Quàtặngsữa .................................................................................................................................................................................. 21
Truytìmkhobáu ............................................................................................................................................................................. 22
Given a sequence of n integers a0,. . .,an-1. We denote rmq(i,j) the minimum element of the
sequence ai, ai+1, . . .,aj. Given m pairs (i1, j1),. . .,(im, jm), compute the sum Q = rmq(i1,j1) + . . .
+ rmq(im, jm)
............................................................................................................................................................................... 22
Find Husband................................................................................................................................................................................ 23
Longest Increasing subsequence ................................................................................................................................................. 24
Longest Common Subsequence ................................................................................................................................................... 24
Hunting_dog ................................................................................................................................................................................. 25
Convert hh:mm:ss to seconds ...................................................................................................................................................... 26
Binary sequence generation ........................................................................................................................................................ 26
Binary sequences generation without consecutive 11 ............................................................................................................... 26
Count number of sudoku solutions ............................................................................................................................................. 27
Permutation generation ............................................................................................................................................................... 28
Family Tree ................................................................................................................................................................................... 28
WATER JUGS ................................................................................................................................................................................. 29
Hamiton Cycle .............................................................................................................................................................................. 30
List order of nodes visited by a DFS ............................................................................................................................................. 31
Minimum Spanning Tree - Kruskal ............................................................................................................................................... 32
Sequence of nodes visited by BFS ............................................................................................................................................... 33
All pair shortest paths .................................................................................................................................................................. 33
Max Flow ...................................................................................................................................................................................... 34
Shortest Path between 2 nodes on a directed graph with non-negative weights ..................................................................... 36
Bank Transaction .......................................................................................................................................................................... 37
Analyze Code Submission of a Programming Contest ................................................................................................................ 38 lOMoAR cPSD| 61601590
Citizen Data Analysis .................................................................................................................................................................... 39
Longest Path on a Tree .................................................................................................................................................................. 41
Problem: Sum of length of paths from root on a tree .................................................................................................................. 42
bank_money_transfer .................................................................................................................................................................. 42
Given a sequence of distinct integers a1, a2, . . ., an . Compute the number P of triples of distinct
indices (i, j, k) such that among 3 items ai, aj , ak there is an item which is equal to the sum of 2
remaining items ............................................................................................................................................................................ 43
After parity lis ............................................................................................................................................................................... 43
stone_castle .................................................................................................................................................................................. 44
CBUS_UPPER_BOUND_CSTR_LENGTH_PICKUP_DROPOFF .......................................................................................................... 45
Compute C_k_n ............................................................................................................................................................................ 46
Check Parenthesis ........................................................................................................................................................................ 47
Equal to the sum of 2 remaining items ....................................................................................................................................... 47
chuyển n túi tiền từ trụ sở chính ................................................................................................................................................. 48 CBUS #include using namespace std ;
int n, K, load,x[10000], Fmin = 99999999, F = 0,M[1000][1000],Cmin=999999 ; bool visited[10000] ;
bool check(int v) { if(visited[v] == true) return false ; if(v>n) { if(visited[v-n]==false) { return false ; } }
else if(load+ 1 > K) return false ; return true ; } void updateBest() {
Fmin = min(Fmin,M[x[2*n]][0]+F) ; return ; }
void Try(int k){ for(int v = 1 ; v<=2*n; v++) {
if(check(v)){ x[k] = v ; visited[v] = true ; if(v<=n) { load ++ ; } else { load-- ; }
F += M[x[k-1]][x[k]] ; if(k==2*n) { updateBest() ; }
else if(F+(2*n-k)*Cmin Try(k+1); } F-= M[x[k-1]][x[k]] ; visited[x[k]] = false ; if(v<=n) { load-- ; } else load++ ; } } }
int main() { memset(x,0, sizeof(x)) ;
memset(visited, false, sizeof(visited)); load = 0 ; cin>>n>>K ;
for(int i =0 ; i<= 2*n ;i++ ) { for(int j = 0 ; j <=
2*n ; j++) { cin>>M[i][j] ; lOMoAR cPSD| 61601590 if(i!=j) { Cmin=min(M[i][j],Cmin) ; } } } x[0] = 0 ; visited[0] = true ; Try(1) ; cout<}
Balanced Courses Assignments #include using namespace std; int m, n, k; vector>favor; bool conflict[31][31]; vectorload; vector>assigned; int ans =
INT_MAX; bool is_valid(int teacher, int course) {
if(find(favor[teacher].begin(), favor[teacher].end(), course + 1) == favor[teacher].end()) return false;
for(int i = 0; i< assigned[teacher].size(); i++) {
if(conflict[course][assigned[teacher][i]]) return false; } return true; } void Try(int index) { if(index == n) {
int max_load_curr = *max_element(load.begin(), load.end()); ans = min(ans, max_load_curr); return; }
for(int teacher = 0; teacher < m; teacher++) {
if(is_valid(teacher, index) && load[teacher] + 1 <= ans) { load[teacher]++;
assigned[teacher].push_back(index); Try(index + 1); load[teacher]--;
assigned[teacher].pop_back(); } } } int main() { cin>> m >>n;
favor.resize(m); load.resize(m,
0); assigned.resize(m); for(int i = 0; i< m; i++) { int k; cin>>k; lOMoAR cPSD| 61601590 favor[i].resize(k); for(int j = 0; j < k; j++) { cin>> favor[i][j]; } } cin>>k;
memset(conflict, false, sizeof(conflict)); for(int i = 0; i< k; i++) { int temp1, temp2;
cin>> temp1 >>temp2;
conflict[temp1 - 1][temp2 - 1] = true;
conflict[temp2 - 1][temp1 - 1] = true; } Try(0); if (ans == INT_MAX) { cout<< -1 < } else { cout< } return 0; }
Count Integer Solutions #include using namespace std; int n, m, a[1000];
int countSolutions(int currentSum, int index) { //
Nếutổnghiệntạibằng M, cómộtnghiệmtìmthấy if
(currentSum == m) { return 1; }
// Nếutổnghiệntạilớnhơn M hoặcđãkiểmtrahếtcáchệsố
if (currentSum> m || index >= n) { return 0; } int totalWays = 0;
for (int x = 0; currentSum + a[index] * x <= m; x++) {
totalWays += countSolutions(currentSum + a[index] * x, index + 1); } return totalWays; } int main() { cin>> n >>m;
for (int i = 0; i< n; i++) { cin>> a[i]; }
int result = countSolutions(0, 0); cout<< result < return 0; } lOMoAR cPSD| 61601590 Disjoint Segment #include using namespace std; struct Edge { int start, end;
Edge(int s = 0, int e = 0) : start(s), end(e) {} };
int disjoint_sets(vector&arr) { int n = arr.size();
sort(arr.begin(), arr.end(), [](Edge a, Edge b) { return a.end }); int res = 1; int last_end = arr[0].end;
for(int i = 0; i< n; i++) {
if(arr[i].start>last_end) { res++; last_end = arr[i].end; } } return res; } int main() { int n; cin>>n; vectorarr(n); for(int i = 0; i< n; i++) {
cin>>arr[i].start>>arr[i].end; } cout<} Inversion #include using namespace std;
const int MOD = 1e9 + 7; // Hằng sốchophéplấykếtquả modulo
// Hàmđểhợpnhấthaimảng con vàđếmsốlượngđảongược long
longmerge_and_count(vector&arr, int left, int mid, int right) { int n1 = mid - left + 1; int n2 = right - mid; vector L(n1), R(n2); for
(int i = 0; i< n1; i++) L[i] =
arr[left + i]; for (int j = 0; j < n2; j++) R[j] = arr[mid + 1 + j]; long long count = 0; int i = 0, j = 0, k = left;
while (i< n1 && j < n2) {
if (L[i] <= R[j]) { arr[k++] = L[i++]; } else {
count += (n1 - i); // Đếmsốđảongược arr[k++] = R[j++]; } } lOMoAR cPSD| 61601590
while (i< n1) arr[k++] = L[i++]; while (j < n2) arr[k++] = R[j++]; return count % MOD; }
// Hàmđệquy merge sort vàđếmđảongược
long longmerge_sort_and_count(vector&arr, int left, int right) { long long
count = 0; if (left < right) {
int mid = left + (right - left) / 2;
count += merge_sort_and_count(arr, left, mid); count +=
merge_sort_and_count(arr, mid + 1, right);
count += merge_and_count(arr, left, mid, right); } return count % MOD; } int main() { int n;
cin>> n; // Nhậpsốlượngphầntử vectorarr(n);
for (int i = 0; i< n; i++) {
cin>>arr[i]; // Nhậpdãysố }
long long result = merge_sort_and_count(arr, 0, n - 1); // Tínhsốđảongược cout<< result <}
Max-Distance Sub-Sequence #include #include #include using namespace std;
// Hàmkiểmtraxemcóthểđặt C phầntửvớikhoảngcáchtốithiểulàdist hay không bool
canPlaceCows(const vector& positions, int n, int c, int dist) { int count = 1; //
Đếmsốphầntửđãđặt
int last_position = positions[0]; // Vịtrícủaphầntửđãđặtcuốicùng for (int i = 1; i< n; i++) {
// Nếukhoảngcáchtừphầntửhiệntạiđếnphầntửđãđặtcuốicùng>= dist if
(positions[i] - last_position>= dist) { count++; // Đặtphầntửmới
last_position = positions[i]; // Cậpnhậtvịtríđãđặt }
if (count == c) return true; // Nếuđãđặtđủ C phầntử }
return false; // Khôngthểđặtđủ C phầntử }
// Hàmtìmkhoảngcáchtốithiểulớnnhất
int findMaxDistance(vector& positions, int n, int c) {
sort(positions.begin(), positions.end()); // Sắpxếpcácvịtrí int left = 1; //
Khoảngcáchnhỏnhấtcóthể
int right = positions[n - 1] - positions[0]; // Khoảngcáchlớnnhấtcóthể int result = 0; while (left <= right) {
int mid = left + (right - left) / 2; // Khoảngcáchthửnghiệm //
Kiểmtraxemcóthểđặt C phầntửvớikhoảngcách mid hay không if lOMoAR cPSD| 61601590
(canPlaceCows(positions, n, c, mid)) { result = mid; // Cậpnhậtkếtquả
left = mid + 1; // Tăngkhoảngcách } else {
right = mid - 1; // Giảmkhoảngcách } }
return result; // Trảvềkhoảngcáchtốiđatìmđược } int main() { int t;
cin>> t; // Nhậpsốlượng test cases while (t--) { int n, c;
cin>> n >> c; // Nhập N và C vector positions(n);
for (int i = 0; i< n; i++) {
cin>> positions[i]; // Nhập các vịtrí }
// Tìmkhoảngcáchtốithiểulớnnhất int result =
findMaxDistance(positions, n, c); cout<< result <Xuấtkếtquả } return 0; } Gold Mining #include using namespace std; int main() { int n, L1, L2;
cin>> n >> L1 >>L2;
vector a(n), dp(n); for (int i = 0; i< n; ++i) cin>> a[i];
// Khởitạo deque đểlưutrữcácchỉsốcủadp
dequedq; long longmax_gold = 0;
for (int i = 0; i< n; ++i) {
// Xóacácphầntửkhôngcầnthiếttrong deque while
(!dq.empty() &&dp[dq.back()] <= dp[i - L1]) { dq.pop_back(); }
// Thêmchỉsốcủadp[i - L1] vào deque if (i - L1 >= 0) { dq.push_back(i - L1); }
// Xóaphầntửđầutiêntrong deque nếunórangoàikhoảng [i - L2] while
(!dq.empty() &&dq.front() } // Tính giá trịdp[i] if (!dq.empty()) { dp[i] = dp[dq.front()] + a[i]; } else {
dp[i] = a[i]; // Nếukhôngcóphầntử nào trong deque lOMoAR cPSD| 61601590 }
max_gold = ((max_gold>dp[i]) ?max_gold : dp[i]); } cout< return 0; } Max Even Subsequence #include using namespace std;
int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin>>n;
long long sum = 0; long longmaxEven =
LLONG_MIN; long longminEven = 0;
long longmaxOdd = LLONG_MIN; long
longminOdd = LLONG_MAX; bool hasEven = false;
for(int i = 0; i< n; i++) { int x; cin>>x; sum += x; if(sum % 2 == 0) {
maxEven = max(maxEven, sum - minEven); minEven = min(minEven, sum); hasEven = true; } else {
if(minOdd != LLONG_MAX) { maxEven = max(maxEven, sum - minOdd); }
if(maxOdd != LLONG_MIN) { maxEven = max(maxEven, sum - maxOdd); } maxOdd = max(maxOdd, sum); minOdd = min(minOdd, sum); } }
if(!hasEven&&maxEven == LLONG_MIN) { cout<< "NOT_FOUND\n"; } else { cout< } return 0; } lOMoAR cPSD| 61601590 Nurse #include using
namespace std; const int MOD = 1e9 + 7; int main() { int n, K1, K2;
cin>> n >> K1 >>K2; // Khởitạomảng f
vector>f(n + 1, vector(2, 0)); // Cơsở
f[0][0] = 1; // 1 cáchđểkhônglàmgìtrong 0 ngày f[0][1] = 1; //
Khôngcócáchnàođểlàmviệctrong 0 ngày
for (int i = 1; i<= n; ++i) { // Tính
f[i][0]: ngàynghỉ f[i][0] = f[i - 1][1];
// Tính f[i][1]: ngàykếtthúccủamộtđợtlàmviệc for (int
j = K1; j <= K2; ++j) { if (i - j >= 0) {
f[i][1] = (f[i][1] + f[i - j][0]) % MOD; } } }
// Kếtquảlàtổngsốcáchlậplịchcho N ngày long long
result = (f[n][0] + f[n][1]) % MOD;
cout<< result < return 0; } Warehouse #include using namespace std;
const int MAXN = 1000; const int
MAXT = 100; const int MOD = 1e9 + 7; int main() { int N, T, D;
cin>> N >> T >>D; vector a(N), t(N);
for (int i = 0; i< N; ++i) cin>> a[i]; for (int i = 0;
i< N; ++i) cin>> t[i];
// DP table to track max goods collected vector>dp(N, vector(T + 1, 0));
// Initialize starting DP values for (int
i = 0; i< N; ++i) { if (t[i] <= T) dp[i][t[i]] = a[i]; } int max_goods = 0; lOMoAR cPSD| 61601590
// DP transitions for (int i = 0; i< N;
++i) { for (int j = 0; j <= T; ++j) { if (dp[i][j] == 0) continue;
// Transition from station i to i + d (1 <= d <= D) for (int d
= 1; d <= D; ++d) { int next_station = i + d; if (next_station>= N) break;
int next_time = j + t[next_station]; if (next_time<= T) {
dp[next_station][next_time] = max(dp[next_station][next_time], dp[i][j] + a[next_station]); max_goods =
max(max_goods, dp[next_station][next_time]); } } } } cout< return 0; } Bridges #include #include #include #include using namespace std; class Graph { public:
Graph(int vertices); void addEdge(int u, int v);
void findArticulationPointsAndBridges(); private:
void dfs(int u, int parent); int V; // Sốđỉnh
vector> adj; // Danh sáchkề vector disc, low; vectorvisited;
setarticulationPoints; vectorint>>bridges; int time; }; Graph::Graph(int vertices) {
V = vertices; adj.resize(V + 1);
disc.resize(V + 1); low.resize(V + 1); visited.resize(V + 1); time = 0; }
void Graph::addEdge(int u, int v) {
adj[u].push_back(v); adj[v].push_back(u); }
void Graph::dfs(int u, int parent) {
visited[u] = true; disc[u] = low[u] = ++time; int children = 0;
for (int v : adj[u]) { if (!visited[v]) {
children++; dfs(v, u); low[u] = min(low[u], low[v]); lOMoAR cPSD| 61601590
// Điềukiệnchođiểmcắt
if (parent != -1 && low[v] >= disc[u]) { articulationPoints.insert(u); } // Điềukiệnchocầu if (low[v] > disc[u]) { bridges.push_back({u, v}); }
} else if (v != parent) { low[u] = min(low[u], disc[v]); } } // Gốccủa DFS
if (parent == -1 && children > 1) { articulationPoints.insert(u); } }
void Graph::findArticulationPointsAndBridges() { for (int i = 1; i<= V; ++i) { if (!visited[i]) { dfs(i, -1); } } cout<} int main() { int N, M; cin>> N >>M; Graph g(N);
for (int i = 0; i< M; ++i) { int u, v; cin>> u >>v; g.addEdge(u, v); }
g.findArticulationPointsAndBridges(); return 0; } Bus Inner City #include
#define FOR(i, x, y) for(int i = x; i<= y; i++) using namespace std;
int n, m; // Sốthànhphốvàsốđườngkếtnối long longcost[5001], maxCities[5001]; // Chi
phívàsốthànhphốtốiđamàtuyếnbuýtcóthểđi long longdp[5001][5001]; // Mảnglưu chi phítốithiểu
vectorgraph[5001]; // Đồthịbiểudiễncácthànhphốvàcácđườngnối
// Định nghĩachocáckiểudữliệuđểsửdụngtronghàngđợiưutiên typedef
pairCostPair; typedef pairState;
priority_queue, greater>pq; // Hàngđợiưutiên
long longfindMinimumCost(int start, int finish) { lOMoAR cPSD| 61601590
// Khởitạomảngdpvớigiátrịlớn FOR(i, 1, n) { FOR(j, 0, n) {
dp[i][j] = LLONG_MAX; // Sửdụng LLONG_MAX đểđạidiệnchovôcùng } }
dp[start][maxCities[start]] = cost[start]; // Chi phíkhibắtđầutừthànhphốbắtđầu
pq.push(State(CostPair(dp[start][maxCities[start]], maxCities[start]), start)); while (!pq.empty()) {
int currentCity = pq.top().second; long
longcurrentCost = pq.top().first.first; int
remainingCities = pq.top().first.second; pq.pop();
// Kiểmtraxem chi phíhiệntạicótươngứngvớigiátrị trong dpkhông if
(currentCost != dp[currentCity][remainingCities]) continue;
// Nếuđãđếnthànhphốđích, trảvề chi phí if
(currentCity == finish) return currentCost;
// Duyệt qua cácthànhphố lân cận for (int
neighbor : graph[currentCity]) {
// Nếucònthànhphốđể đi if (remainingCities> 0) {
// Cậpnhật chi phínếuđiđếnthànhphốlâncậnmàkhôngtínhthêm chi phí if
(dp[neighbor][remainingCities - 1] >currentCost) { dp[neighbor][remainingCities - 1] = currentCost;
pq.push(State(CostPair(currentCost, remainingCities - 1), neighbor)); }
// Cậpnhật chi phínếulênxebuýtmới
if (dp[neighbor][maxCities[neighbor]] > currentCost + cost[neighbor]) {
dp[neighbor][maxCities[neighbor]] = currentCost + cost[neighbor];
pq.push(State(CostPair(currentCost + cost[neighbor], maxCities[neighbor]), neighbor)); } } } }
return -1; // Nếukhôngtìmthấyđườngđiđếnthànhphốđích } int main() {
// Nhậpsốlượngthànhphốvàđườngkếtnối cin>> n >>m; FOR(i, 1, n) {
cin>> cost[i] >>maxCities[i]; // Nhập chi phívàsốthànhphốtốiđachomỗituyếnbuýt }
// Nhậpcácđườngkếtnốigiữacácthànhphố while (m--) { int a, b; cin>> a >>b; graph[a].push_back(b);
graph[b].push_back(a); // Đồthịvôhướng }
// Tìm chi phítốithiểuđểđitừthànhphố 1 đếnthànhphố n cout< return 0; } lOMoAR cPSD| 61601590 Make Span Schedule #include using namespace std; int main() { int n, m;
cin>> n >>m; vector d(n+1);
for (int i = 1; i<= n; ++i) { cin>> d[i]; } vector> graph(n+1);
vector bac (n+1, 0); for (int i = 0; i< m; ++i) { int u, v;
cin>> u >>v; graph[u].push_back(v); bac[v]++; } queueq;
vectorcompletion(n+1, 0); for (int i
= 1; i<= n; ++i) { if (bac[i] == 0) { q.push(i); completion[i] = d[i]; } } while (!q.empty()) { int u = q.front(); q.pop();
for (int neighbor : graph[u]) { bac[neighbor]--;
completion[neighbor] = max(completion[neighbor], completion[u] + d[neighbor]); if (bac[neighbor] == 0) { q.push(neighbor); } } } int res = 0;
for (int i = 1; i<= n; i++) { res = max(res, completion[i]);
} cout<< res <return 0; }
Strongly Connected Components
#include using namespace std; void dfs(vector>& graph, vector& visited,
stack&finishStack, int start) { visited[start] = true; for (int neighbor : graph[start]) { if (!visited[neighbor]) {
dfs(graph, visited, finishStack, neighbor); } } finishStack.push(start); }
void dfs_reverse(vector>&reverse_graph, vector& visited, int start) { visited[start] = true; lOMoAR cPSD| 61601590
for (int neighbor :reverse_graph[start]) { if (!visited[neighbor]) {
dfs_reverse(reverse_graph, visited, neighbor); } } } int main() { int n, m; cin>> n >>m; vector> graph(n+1); vector>reverse_graph(n+1);
for (int i = 0; i< m; ++i) { int u, v;
cin>> u >>v; graph[u].push_back(v);
reverse_graph[v].push_back(u); } // dfs G
vector visited (n+1, false); stackfinishStack;
for(int i = 1; i<= n; i++) { if (!visited[i]) { dfs(graph, visited, finishStack, i); } } // dfs G_T
visited.assign(n+1, false); int cnt = 0;
while (!finishStack.empty()) { int u = finishStack.top();
finishStack.pop(); if(!visited[u]) {
dfs_reverse(reverse_graph, visited, u); cnt++; } } cout<return 0; }
Telco data check & query #include using namespace std; struct CallLog { string from_number; string to_number; string date; string from_time; string end_time; };
// Hàmkiểmtratínhhợplệcủasốđiệnthoại bool
isValidPhoneNumber(const string& number) { if
(number.size()!= 10) return false; for (int i = 0;
i if (!(number[i] >= '0' && number[i] <= '9')) return false; } return true; }
// Hàmtínhtổngthờigiancuộcgọitheogiây
int calculateDuration(const string& start, const string& end) { int startTime=
3600*((start[0]-'0')*10 + start[1]-'0') lOMoAR cPSD| 61601590
+ 60*((start[3]-'0')*10 + start[4]-'0') +
((start[6]-'0')*10 + start[7]-'0'); int endTime= 3600*((end[0]- '0')*10 + end[1]-'0')
+ 60*((end[3]-'0')*10 + end[4]-'0') +
((end[6]-'0')*10 + end[7]-'0'); return endTime - startTime; }
int main() { vectorlogs; unordered_mapint>calls_from; unordered_maplong>total_time_from; string line;
while (true) { getline(cin, line); if (line == "#") break; if
(line.find("call") == 0) { stringstream ss(line);
string keyword, from_number, to_number, date, from_time, end_time; ss >> keyword
>>from_number>>to_number>> date >>from_time>>end_time; logs.push_back({from_number, to_number,
date, from_time, end_time}); calls_from[from_number]++;
total_time_from[from_number] += calculateDuration(from_time, end_time); } } while (true) { cin>>line; if (line == "#") break;
if (line == "?check_phone_number") {
bool all_valid = true; for (const auto&log : logs) {
if (!isValidPhoneNumber(log.from_number) || !isValidPhoneNumber(log.to_number)) { all_valid = false; break; } }
cout<< (all_valid ?1 : 0) < } else if (line == "?number_calls_from") { string
phone_number; cin>>phone_number;
cout< } else if (line == "?number_total_calls") { cout< } else if (line == "?count_time_calls_from") { string
phone_number; cin>>phone_number; cout< } } return 0; } Maze #include using namespace std;
int BFS(int n, int m, int r, int c, vector>& maze) {
// Các hướng di chuyển: lên, xuống, trái, phải
vector> directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; queue>
q; // Queue đểlưutọađộ q.push({r, c});
// Mảng 2 chiềukiểmtrađãghéthămchưa lOMoAR cPSD| 61601590
vector>visited(n, vector(m, false)); visited[r][c] =
true; int steps = 0; // Đếmsốbướcđãđi while (!q.empty()) { int size = q.size();
steps++; // Tăngsốbướcsaumỗilầnlặp
for (int i = 0; i< size; ++i) { int x = q.front().first; int y = q.front().second; q.pop();
// Kiểmtranếuđãra biên
if (x == 0 || x == n - 1 || y == 0 || y == m - 1) { return steps; // Trảvềsốbước }
// Kiểmtracác ô lâncận
for (pairdirection : directions) { int
new_x = x + direction.first; int new_y = y + direction.second;
// Kiểmtraxem ô mớicóhợplệkhông
if (new_x>= 0 &&new_x< n &&new_y>= 0 &&new_y< m &&
maze[new_x][new_y] == 0 && !visited[new_x][new_y]) {
visited[new_x][new_y] = true; q.push({new_x, new_y}); } } } }
// Nếukhôngtìmthấyđườngthoát return -1; } int main() { int n, m, r, c;
cin>> n >> m >> r >>c;
r--; c--; // Chuyển sang chỉsố 0 vector>maze(n, vector(m)); //
Sửdụng vector for (int i = 0; i< n; ++i) {
for (int j = 0; j < m; ++j) { cin>> maze[i][j]; } } cout<} Range Minimum Query #include using namespace std; int main() {
int n, queries, i, j, sum = 0; cin>>n; int a[n];
int maxLog = log2(n) + 1; // so hang cuamang 2 chieu int b[n][maxLog];
for (int k = 0; k < n; k++) cin>> a[k];
// preprocessing for (int k = 0; k < n; k++) {
b[k][0] = k; // khoitao hang dautien lOMoAR cPSD| 61601590 }
// tinhtoancac hang con lai for (int h = 1; (1 << h) <= n; h++) {
for (int k = 0; k + (1 << h) - 1 < n; k++) { if (a[b[k][h - 1]] < a[b[k +
(1 << (h - 1))][h - 1]]) { b[k][h] = b[k][h - 1]; } else {
b[k][h] = b[k + (1 << (h - 1))][h - 1]; } } } // processing cin>>queries;
while (queries--) { cin>>i>>j;
int range = (1 << (int)log2(j - i + 1)); // do dai moi khoang int column = (int)log2(j -
i + 1); // toa do theo cot trenmang 2 chieu
// tim min trongcackhoang int minIndex1 = b[i][column];
int minIndex2 = b[j - range + 1][column]; int minValue =
min(a[minIndex1], a[minIndex2]); sum += minValue; }
cout<< sum < return 0; }
Largest black subrectangle #include using namespace std;
// Hàmtínhdiệntíchlớnnhấttrongmộtmảngchiềucao int
maxRectangleArea(int heights[], int m) { stacks; int maxArea = 0;
for (int j = 0; j <= m; j++) { int h = (j == m) ?0 :
heights[j]; while (!s.empty() && heights[s.top()] > h) {
int height = heights[s.top()]; s.pop();
int width = s.empty() ? j : j - s.top() - 1; maxArea = max(maxArea, height * width); } s.push(j); } return maxArea; } int main() { int n, m; cin>> n >>m;
int matrix[n][m]; for (int i = 0; i< n;
i++) { for (int j = 0; j < m; j++) { cin>> matrix[i][j]; } } // Tạomảngchiềucao int height[m];
for (int j = 0; j < m; j++) height[j] = 0; int maxArea = 0; lOMoAR cPSD| 61601590
for (int i = 0; i< n; ++i) { for (int j = 0; j < m; ++j) { //
Cậpnhậtchiềucao if (matrix[i][j] == 1) { height[j]++; } else { height[j] = 0; } }
// Tínhdiệntíchlớnnhấtchohànghiệntại
maxArea = max(maxArea, maxRectangleArea(height, m)); } cout< return 0; }
Max-Distance Sub-Sequence #include #include #include using namespace std;
// Hàmkiểmtraxemcóthểđặt C phầntửvớikhoảngcáchtốithiểulàdist hay không bool
canPlaceCows(const vector& positions, int n, int c, int dist) { int count = 1; //
Đếmsốphầntửđãđặt
int last_position = positions[0]; // Vịtrícủaphầntửđãđặtcuốicùng for (int i = 1; i< n; i++) {
// Nếukhoảngcáchtừphầntửhiệntạiđếnphầntửđãđặtcuốicùng>= dist if
(positions[i] - last_position>= dist) { count++; // Đặtphầntửmới
last_position = positions[i]; // Cậpnhậtvịtríđãđặt }
if (count == c) return true; // Nếuđãđặtđủ C phầntử }
return false; // Khôngthểđặtđủ C phầntử }
// Hàmtìmkhoảngcáchtốithiểulớnnhất
int findMaxDistance(vector& positions, int n, int c) {
sort(positions.begin(), positions.end()); // Sắpxếpcácvịtrí int left = 1; //
Khoảngcáchnhỏnhấtcóthể
int right = positions[n - 1] - positions[0]; // Khoảngcáchlớnnhấtcóthể int result = 0; while (left <= right) {
int mid = left + (right - left) / 2; // Khoảngcáchthửnghiệm //
Kiểmtraxemcóthểđặt C phầntửvớikhoảngcách mid hay không if
(canPlaceCows(positions, n, c, mid)) { result = mid; // Cậpnhậtkếtquả
left = mid + 1; // Tăngkhoảngcách } else {
right = mid - 1; // Giảmkhoảngcách } }
return result; // Trảvềkhoảngcáchtốiđatìmđược } int main() { int t;
cin>> t; // Nhậpsốlượng test cases while (t--) { lOMoAR cPSD| 61601590 int n, c;
cin>> n >> c; // Nhập N và C vector positions(n);
for (int i = 0; i< n; i++) {
cin>> positions[i]; // Nhập các vịtrí }
// Tìmkhoảngcáchtốithiểulớnnhất int result =
findMaxDistance(positions, n, c); cout<< result <Xuấtkếtquả } return 0; } Cut Material #include using namespace std;
int height, width, n; int h[10], w[10], mark[10][10]; void doMark(int x,
int y, int xoay, int k, bool mark_value) { int wk = w[k]; int hk = h[k]; if (xoay == 1) { swap(wk, hk); }
for (int i = x; i<= x + wk -1; i++) { for (int j = y; j <= y + hk -1; j++) { mark[i][j] = mark_value; } } }
bool check(int xoay, int x, int y, int k) { int wk =
w[k]; int hk = h[k]; if (xoay == 1) { swap(wk, hk); }
if (x + wk> width || y + hk> height) return false; for (int i =
x; i<= x + wk -1; i++) { for (int j = y; j <= y + hk - 1; j++) {
if (mark[i][j]) { return false; } } } return true; } bool tryy(int k) { if (k == n) { return true; }
for (int xoay = 0; xoay<= 1; xoay++) { int wk =
w[k]; int hk = h[k]; if (xoay == 1) { swap(wk, hk); }
for (int x = 0; x <= width - wk; x++) { for (int y =
0; y <= height - hk; y++) { if (check(xoay, x, y, k)) { doMark(x, y, xoay, k, true); lOMoAR cPSD| 61601590
if (tryy(k + 1)) return true; doMark(x, y, xoay, k, false); } } } } return false; }
int main() { cin>> height >>width; cin>>n;
for (int i = 0; i< n; i++) {
cin>> w[i] >> h[i]; } if (tryy(0)) { cout<< 1 < } else { cout<< 0 < } return 0; }
Max Matching on Bipartie Graph #include #include #include
using namespace std; const int MAX_N = 10000;
vectortasks[MAX_N + 1]; // Danh sáchnhiệmvụchotừngnhânviên int staffAssignment[MAX_N +
1]; // Mảnglưunhânviênđãđượcphâncôngchonhiệmvụ bool visited[MAX_N + 1]; //
Mảngđánhdấunhânviênđãđượcthăm
bool canAssign(int task) { for (int staff : tasks[task]) { if (!visited[staff]) {
visited[staff] = true; // Đánhdấunhânviênđã thăm //
Nếunhânviênchưađượcphâncônghoặccóthểphâncônglại if (staffAssignment[staff] == 0 ||
canAssign(staffAssignment[staff])) { staffAssignment[staff] = task; // Phâncôngnhiệmvụcho nhân viên return true; } } } return false; } int main() { int n, m; cin>> n >>m;
// Đọcnhiệmvụvànhânviêncóthểthựchiện
for (int i = 1; i<= n; ++i) { int k;
cin>> k; // Sốnhânviênchonhiệmvụi tasks[i].resize(k);
for (int j = 0; j < k; ++j) {