Skip to content

Commit d50073a

Browse files
committed
Add Segment-Tree Problem: Lucky Queries.
1 parent 1662573 commit d50073a

File tree

3 files changed

+141
-0
lines changed

3 files changed

+141
-0
lines changed

Graphs/Floyd-Warshall.cpp

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#include <iostream>
2+
#define INF INT_MAX
3+
using namespace std;
4+
int dist[64][64], adj[64][64];
5+
6+
void setDistances(int n) {
7+
for (int t=1;t<=n;++t) {
8+
for (int j=1;j<=n;++j) {
9+
if (t == j) dist[t][j] = 0;
10+
else if (adj[t][j]) dist[t][j] = adj[t][j];
11+
else dist[t][j] = INF;
12+
}
13+
}
14+
return;
15+
}
16+
17+
void Floyd(int n) {
18+
for (int k=1;k<=n;++k) {
19+
for (int t=1;t<=n;++t) {
20+
for (int j=1;j<=n;++j) {
21+
dist[t][j] = min(dist[t][j], (dist[t][k] + dist[k][j]));
22+
}
23+
}
24+
}
25+
return;
26+
}
27+
28+
void addEdge(int src, int dest, int wt) {
29+
adj[src][dest] = wt;
30+
adj[dest][src] = wt;
31+
}
32+
33+
void initGraph(int n) {
34+
for (int t=1;t<=n;++t) {
35+
for (int j=1;j<=n;++j) {
36+
if (t == j) adj[t][j] = 0;
37+
else adj[t][j] = INF;
38+
}
39+
}
40+
return;
41+
}
42+
43+
int main() {
44+
int n = 5;
45+
initGraph(n);
46+
47+
addEdge(1, 2, 5);
48+
addEdge(1, 4, 9);
49+
addEdge(1, 5, 1);
50+
addEdge(2, 3, 2);
51+
addEdge(3, 2, 2);
52+
addEdge(3, 4, 7);
53+
addEdge(4, 1, 9);
54+
addEdge(4, 3, 7);
55+
addEdge(4, 5, 2);
56+
addEdge(5, 1, 1);
57+
addEdge(5, 4, 2);
58+
59+
setDistances(n);
60+
Floyd(n);
61+
62+
for (int t=1;t<=n;++t) {
63+
for (int j=1;j<=n;++j) {
64+
cout << dist[t][j] << " ";
65+
}
66+
cout << "\n";
67+
}
68+
69+
}
70+

Segment-Tree/Problems/a.out

5 KB
Binary file not shown.
+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#include <iostream>
2+
#include <string.h>
3+
#define MAX_ 1000
4+
using namespace std;
5+
int tree[MAX_] = {0};
6+
int lazy[MAX_] = {-1};
7+
8+
int diff(int st, int ed, int x) {
9+
return (ed - x - (st - 1));
10+
}
11+
12+
void Build(string arr, int st, int ed, int treeNode) {
13+
if (st == ed) {
14+
if (arr[st] == '4')
15+
tree[treeNode] = 1;
16+
else
17+
tree[treeNode] = 0;
18+
19+
return;
20+
}
21+
22+
int mid = (st + ed)/2;
23+
Build(arr, st, mid, 2 * treeNode);
24+
Build(arr, mid+1, ed, (2*treeNode)+1);
25+
26+
tree[treeNode] = tree[2 * treeNode] + tree[(2*treeNode)+1];
27+
}
28+
29+
void lazyUpdate(string arr, int st, int ed, int qs, int qe, int treeNode) {
30+
if (lazy[treeNode] != -1) {
31+
tree[treeNode] = lazy[treeNode];
32+
33+
if (st != ed) {
34+
tree[2*treeNode] = diff(st, ed, tree[2*treeNode]);
35+
tree[(2*treeNode)+1] = diff(st, ed, tree[(2*treeNode)+1]);
36+
}
37+
lazy[treeNode] = -1;
38+
}
39+
if (st > qe || ed < qs) return;
40+
41+
if (st >= qs && ed <= qe) {
42+
tree[treeNode] = diff(st, ed, tree[treeNode]);
43+
44+
if (st != ed) {
45+
tree[2 * treeNode] = diff(st, ed, tree[2 * treeNode]);
46+
tree[(2 * treeNode)+1] = diff(st, ed, tree[(2*treeNode)+1]);
47+
}
48+
return;
49+
}
50+
int mid = (st + ed)/2;
51+
lazyUpdate(arr, st, mid, qs, qe, 2 * treeNode);
52+
lazyUpdate(arr, mid+1, ed, qs, qe, (2 * treeNode)+1);
53+
54+
tree[treeNode] = tree[2 * treeNode] + tree[(2*treeNode)+1];
55+
}
56+
57+
int main() {
58+
string arr = "47447747";
59+
int n = arr.length();
60+
61+
Build(arr, 0, n-1, 1);
62+
63+
for (int t=1;t<2*n;++t)
64+
cout << tree[t] << " ";
65+
66+
cout << endl;
67+
lazyUpdate(arr, 0, n-1, 1, 4, 1);
68+
69+
for (int t=1;t<2*n;++t)
70+
cout << tree[t] << " ";
71+
}

0 commit comments

Comments
 (0)