Skip to content

Commit 7d99355

Browse files
committed
LC & CF Update
1 parent 0e59d86 commit 7d99355

File tree

6 files changed

+260
-70
lines changed

6 files changed

+260
-70
lines changed
Lines changed: 56 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,56 @@
1-
#include <iostream>
2-
#include <cstdio>
3-
#include <cmath>
4-
#include <vector>
5-
#include <queue>
6-
#include <stack>
7-
#include <cstring>
8-
#include <algorithm>
9-
#include <map>
10-
#include <unordered_map>
11-
#include <set>
12-
#include <unordered_set>
13-
#include <sstream>
14-
15-
using namespace std;
16-
17-
#define LL long long
18-
#define pb push_back
19-
#define mp make_pair
20-
#define PII pair < int , int >
21-
#define infile(f) freopen(f,"r",stdin)
22-
#define outfile(f) freopen(f,"w",stdout)
23-
24-
inline bool checkBit(int mask,int pos) { return (bool) (mask & (1 << pos)); }
25-
inline int setBit(int mask,int pos) { return (mask | (1 << pos)); }
26-
//int dx[]={1,0,-1,0};
27-
//int dy[]={0,1,0,-1}; //4 Direction
28-
//int dx[]={1,1,0,-1,-1,-1,0,1};
29-
//int dy[]={0,1,1,1,0,-1,-1,-1};//8 direction
30-
31-
const int MAXN = 30000 + 5; // adjust max size accordingly
32-
int par[MAXN],Rank[MAXN];
33-
34-
void initialize(int n){
35-
for(int i = 0 ; i < n ; i++){
36-
par[i] = i; // initially everybody is their own parent
37-
Rank[i] = 1; // subset size 1
38-
}
39-
}
40-
41-
int Find(int i){
42-
while(par[i] != i){
43-
par[i] = par[par[i]]; // setting's i's grandparent as i's new parent, flattening the tree, path compression
44-
i = par[i]; // walking up the ladder;
45-
}
46-
return i;
47-
}
48-
49-
void Union(int a,int b){
50-
int rootA = Find(a);
51-
int rootB = Find(b);
52-
53-
if(rootA == rootB) return; // if they are connected already, no need to go further
54-
55-
if(Rank[rootA] < Rank[rootB]){ // balancing the tree
56-
par[rootA] = rootB;
57-
Rank[rootB] += Rank[rootA];
58-
} else{
59-
par[rootB] = rootA;
60-
Rank[rootA] += Rank[rootB];
61-
}
62-
}
63-
64-
int main(){
65-
66-
67-
return 0;
68-
}
69-
70-
1+
class DSU{
2+
vector <int> parent, rank, minimum, maximum, total_elements;
3+
4+
public:
5+
DSU(int n){
6+
parent.resize(n + 1);
7+
minimum.resize(n + 1);
8+
maximum.resize(n + 1);
9+
total_elements.assign(n + 1, 1);
10+
rank.assign(n + 1, 0);
11+
initialize(n);
12+
}
13+
14+
void initialize(int n){
15+
for(int i = 1 ; i <= n ; ++i){
16+
parent[i] = i;
17+
minimum[i] = i;
18+
maximum[i] = i;
19+
}
20+
}
21+
22+
int find_parent(int element){
23+
if(parent[element] == element) return element;
24+
return parent[element] = find_parent(parent[element]);
25+
}
26+
27+
void union_by_rank(int a, int b){
28+
int pa = find_parent(a);
29+
int pb = find_parent(b);
30+
if(pa == pb) return;
31+
if(rank[pa] == rank[pb]) ++rank[pa];
32+
if(rank[pa] > rank[pb]){
33+
parent[pb] = pa;
34+
total_elements[pa] += total_elements[pb];
35+
minimum[pa] = min(minimum[pa], minimum[pb]);
36+
maximum[pa] = max(maximum[pa], maximum[pb]);
37+
} else{
38+
parent[pa] = pb;
39+
total_elements[pb] += total_elements[pa];
40+
minimum[pb] = min(minimum[pa], minimum[pb]);
41+
maximum[pb] = max(maximum[pa], maximum[pb]);
42+
}
43+
}
44+
45+
int getSize(int v){
46+
return total_elements[find_parent(v)];
47+
}
48+
49+
int getMin(int v){
50+
return minimum[find_parent(v)];
51+
}
52+
53+
int getMax(int v){
54+
return maximum[find_parent(v)];
55+
}
56+
};

Codeforces/EDU/DSU/Step 1/1-A.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#include <iostream>
2+
#include <vector>
3+
4+
using namespace std;
5+
6+
class DSU{
7+
vector <int> parent, rank;
8+
9+
public:
10+
DSU(int n){
11+
parent.resize(n + 1);
12+
rank.assign(n + 1, 0);
13+
initialize_parent(n);
14+
}
15+
16+
void initialize_parent(int n){
17+
for(int i = 1 ; i <= n ; ++i){
18+
parent[i] = i;
19+
}
20+
}
21+
22+
int find_parent(int element){
23+
if(parent[element] == element) return element;
24+
return parent[element] = find_parent(parent[element]);
25+
}
26+
27+
void union_by_rank(int a, int b){
28+
int pa = find_parent(a);
29+
int pb = find_parent(b);
30+
if(pa == pb) return;
31+
if(rank[pa] == rank[pb]) ++rank[pa];
32+
if(rank[pa] > rank[pb]){
33+
parent[pb] = pa;
34+
} else{
35+
parent[pa] = pb;
36+
}
37+
}
38+
};
39+
40+
int main(int argc, char const *argv[])
41+
{
42+
int n, m;
43+
cin >> n >> m;
44+
DSU dsu(n);
45+
for(int i = 0 ; i < m ; ++i){
46+
string q;
47+
int u,v;
48+
cin >> q >> u >> v;
49+
if(q == "union"){
50+
dsu.union_by_rank(u, v);
51+
} else{
52+
cout << (dsu.find_parent(u) == dsu.find_parent(v) ? "YES" : "NO") << '\n';
53+
}
54+
}
55+
return 0;
56+
}

Codeforces/EDU/DSU/Step 1/1-B.cpp

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
#include <iostream>
2+
#include <vector>
3+
#include <algorithm>
4+
5+
using namespace std;
6+
7+
class DSU{
8+
vector <int> parent, rank, minimum, maximum, total_elements;
9+
10+
public:
11+
DSU(int n){
12+
parent.resize(n + 1);
13+
minimum.resize(n + 1);
14+
maximum.resize(n + 1);
15+
total_elements.assign(n + 1, 1);
16+
rank.assign(n + 1, 0);
17+
initialize(n);
18+
}
19+
20+
void initialize(int n){
21+
for(int i = 1 ; i <= n ; ++i){
22+
parent[i] = i;
23+
minimum[i] = i;
24+
maximum[i] = i;
25+
}
26+
}
27+
28+
int find_parent(int element){
29+
if(parent[element] == element) return element;
30+
return parent[element] = find_parent(parent[element]);
31+
}
32+
33+
void union_by_rank(int a, int b){
34+
int pa = find_parent(a);
35+
int pb = find_parent(b);
36+
if(pa == pb) return;
37+
if(rank[pa] == rank[pb]) ++rank[pa];
38+
if(rank[pa] > rank[pb]){
39+
parent[pb] = pa;
40+
total_elements[pa] += total_elements[pb];
41+
minimum[pa] = min(minimum[pa], minimum[pb]);
42+
maximum[pa] = max(maximum[pa], maximum[pb]);
43+
} else{
44+
parent[pa] = pb;
45+
total_elements[pb] += total_elements[pa];
46+
minimum[pb] = min(minimum[pa], minimum[pb]);
47+
maximum[pb] = max(maximum[pa], maximum[pb]);
48+
}
49+
}
50+
51+
int getSize(int v){
52+
return total_elements[find_parent(v)];
53+
}
54+
55+
int getMin(int v){
56+
return minimum[find_parent(v)];
57+
}
58+
59+
int getMax(int v){
60+
return maximum[find_parent(v)];
61+
}
62+
};
63+
64+
int main(int argc, char const *argv[])
65+
{
66+
ios_base::sync_with_stdio(false);
67+
cin.tie(0);
68+
int n, m;
69+
cin >> n >> m;
70+
DSU dsu(n);
71+
for(int i = 0 ; i < m ; ++i){
72+
string q;
73+
cin >> q;
74+
if(q == "union"){
75+
int u,v;
76+
cin >> u >> v;
77+
dsu.union_by_rank(u, v);
78+
} else{
79+
int v;
80+
cin >> v;
81+
cout << dsu.getMin(v) << " " << dsu.getMax(v) << " " << dsu.getSize(v) << '\n';
82+
}
83+
}
84+
return 0;
85+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public:
3+
uint32_t reverseBits(uint32_t n) {
4+
uint32_t reversed = 0;
5+
for(int i = 0 ; i < 32 ; ++i){
6+
reversed = (reversed << 1) | ((n & (1 << i)) >> i);
7+
}
8+
return reversed;
9+
}
10+
};
11+
12+
/*
13+
uint32_t reverseBits(uint32_t n) {
14+
uint32_t reversed = 0;
15+
for(int i = 0 ; i < 32 ; ++i){
16+
reversed = (reversed << 1) | (n & 1);
17+
n >>= 1;
18+
}
19+
return reversed;
20+
}
21+
*/
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
8+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
9+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10+
* };
11+
*/
12+
13+
struct Info{
14+
long long sum;
15+
int count;
16+
};
17+
18+
class Solution {
19+
public:
20+
int getLevels(TreeNode *root){
21+
if(root == NULL) return 0;
22+
return 1 + max(getLevels(root -> left), getLevels(root -> right));
23+
}
24+
void getInfo(TreeNode *root, int tL, vector<Info> &info, int cL = 0){
25+
if(root == NULL) return;
26+
if(cL == tL) return;
27+
info[cL].sum += root -> val;
28+
++info[cL].count;
29+
getInfo(root -> left, tL, info, cL + 1);
30+
getInfo(root -> right, tL, info, cL + 1);
31+
}
32+
vector<double> averageOfLevels(TreeNode* root) {
33+
int levels = getLevels(root);
34+
vector <Info> info(levels); // info[0] --> sum, info[1] --> count
35+
getInfo(root, levels, info);
36+
vector <double> average(levels);
37+
for(int i = 0 ; i < levels ; ++i){
38+
average[i] = info[i].sum * 1.0 / info[i].count;
39+
}
40+
return average;
41+
}
42+
};

0 commit comments

Comments
 (0)