Skip to content
Programmingoneonone
Programmingoneonone

Learn everything about programming

  • Home
  • CS Subjects
    • Internet of Things (IoT)
    • Digital Communication
    • Human Values
  • Programming Tutorials
    • C Programming
    • Data structures and Algorithms
    • 100+ Java Programs
    • 100+ C Programs
  • HackerRank Solutions
    • HackerRank Algorithms Solutions
    • HackerRank C problems solutions
    • HackerRank C++ problems solutions
    • HackerRank Java problems solutions
    • HackerRank Python problems solutions
Programmingoneonone
Programmingoneonone

Learn everything about programming

HackerEarth Grid of Many Xors problem solution

YASH PAL, 31 July 2024
In this HackerEarth Grid of Many Xors problem solution Consider a grid with N rows and M columns, where each cell has some integer value written in it. Every cell is connected to every side adjacent cell via an undirected edge. The cost of an edge e connecting any two cells with value a and b is Ce = a xor b. 
We define a good trip between two cells (r1, c1) and (r2, c2) as a trip starting at cell (r1, c1) and ending at cell (r2, c2) while visiting every cell of the grid at least once.
There is a cost associated with every good trip. Let’s say, for a given edge e, you travel that edge Te times. Then the cost of the trip is:
Summation(for all e) (Ce * Ceil(Te/2))
For the given starting cell (r1, c1) and ending cell (r2, c2), you have to find the minimum cost of a good trip.
HackerEarth Grid of Many Xors problem solution

HackerEarth Grid of Many Xors problem solution.

#include <bits/stdc++.h>
using namespace std;

struct dsu {
vector<int> Rank, P;
int V;
dsu(int v = 0) : V(v) {
Rank = vector<int>(v + 1, 0);
P = vector<int>(v + 1, 0);
for(int i = 0; i < P.size(); i++) {
P[i] = i, Rank[i] = 1;
}
}
int find_root(int x) { return x == P[x] ? x : P[x] = find_root(P[x]); }
void merge(int x, int y) {
int xr = find_root(P[x]), yr = find_root(P[y]);
if(xr == yr) return ;
if(Rank[xr] < Rank[yr]) swap(xr, yr), swap(x, y);
Rank[xr] += Rank[yr];
P[yr] = xr;
}
};

int main() {
ios_base::sync_with_stdio(false);
int t, n, m, r1, c1, r2, c2;
cin >> t;
while(t--) {
cin >> n >> m;
cin >> r1 >> c1 >> r2 >> c2;
vector<vector<int> > grid(n, vector<int>(m, 0));
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
cin >> grid[i][j];
}
}
vector<pair<int, pair<int, int> > > edges;
auto encode = [&](int r, int c) -> int {
return r * m + c;
};
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(j + 1 != m)
edges.push_back({grid[i][j] ^ grid[i][j + 1],
{encode(i, j), encode(i, j + 1)}});
if(i + 1 != n)
edges.push_back({grid[i][j] ^ grid[i + 1][j],
{encode(i, j), encode(i + 1, j)}});
}
}
sort(edges.begin(), edges.end());
dsu tester(n*m);
long long res = 0;
for(int i = 0; i < edges.size(); i++) {
int wt = edges[i].first, a = edges[i].second.first, b = edges[i].second.second;
if(tester.find_root(a) != tester.find_root(b)) {
res += wt;
tester.merge(a, b);
}
}
cout << res << 'n';
}
return 0;
}

Second solution

#include <bits/stdc++.h>
using namespace std;
#define pi pair<int, int>
#define f first
#define s second
#define rep(i, N) for(int i=0;i<N;i++)

int pa[100011];
int sz[100011];


int f(int x) {
if(x == pa[x]) return x;
return pa[x] = f(pa[x]);
}
bool join(int a, int b) {
a = f(a);
b = f(b);
if(a != b) {
if(sz[a] < sz[b]) swap(a, b);
pa[b] = a;
sz[a] += sz[b];
return 1;
}
return 0;
}
struct Edge{
int u,v,val;
};
bool func(Edge a, Edge b) {
return a.val < b.val;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int T;
cin >> T;
while(T--) {
int N,M;
cin >> N >> M;
vector<vector<int> >G(N, vector<int>(M));
int r1,c1,r2,c2;
cin >> r1 >> c1 >> r2 >> c2;
// No need for r1 c1 r2 c2. The value of answer is independent of them.
map<pi, int> C;
int cnt = 0;
vector<Edge> E;
rep(i, N) {
rep(j, M) {
cin >> G[i][j];
C[{i,j}] = cnt++;
if(i-1 >= 0) {
E.push_back({C[{i-1,j}], C[{i,j}], G[i][j]^G[i-1][j] });
}
if(j-1 >= 0) {
E.push_back({C[{i,j-1}], C[{i,j}], G[i][j]^G[i][j-1] });
}
}
}
sort(E.begin(),E.end(),func);
for(int j=0;j<cnt;j++) {
pa[j] = j;
sz[j] = 1;
}
int ans = 0;
for(auto e:E) {
if(join(e.u,e.v)) ans += e.val;
}
cout << ans << "n";
}
}
coding problems solutions

Post navigation

Previous post
Next post

Pages

  • About US
  • Contact US
  • Privacy Policy

Follow US

  • YouTube
  • LinkedIn
  • Facebook
  • Pinterest
  • Instagram
©2025 Programmingoneonone | WordPress Theme by SuperbThemes