forked from Masked-coder11/gfg-POTD
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path01.04.2024.cpp
90 lines (69 loc) · 2.02 KB
/
01.04.2024.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// User function Template for C++
/*// A Tree node
struct Node
{
int data;
struct Node *left, *right;
};*/
class Solution {
public:
long long int merge(vector<int>&arr, long long low, long long mid, long long high){
long long temp[high-low+1];
long long int k=0;
long long int i=low;
long long int j=mid+1;
long long int inv=0;
while(i<=mid && j<=high){
if(arr[i]<=arr[j]){
temp[k++]=arr[i++];
}
else{
inv+= mid-i +1;
temp[k++]=arr[j++];
}
}
while(i<=mid){
temp[k++]=arr[i++];
}
while(j<=high){
temp[k++]=arr[j++];
}
for(int x=low; x<=high; x++){
arr[x]=temp[x-low];
}
return inv;
}
long long int mergeSort(vector<int>&arr, long long int low, long long int high){
if(low>=high) return 0;
long long int inv=0;
long long mid= (low+high)/2;
inv += mergeSort(arr, low, mid);
inv += mergeSort(arr, mid+1, high);
inv += merge(arr, low, mid, high);
return inv;
}
long long int inversionCount(vector<int>&arr, long long N)
{
// Your Code Here
long long int ans= mergeSort(arr, 0, N-1);
return ans;
}
void inorder(Node*root, vector<int>&arr){
if(root){
inorder(root->left, arr);
arr.push_back(root->data);
inorder(root->right, arr);
}
return;
}
/*You are required to complete below function */
int pairsViolatingBST(int n, Node *root) {
// your code goes here
// store inorder traversal
vector<int>arr;
inorder(root, arr);
// i just want to retun count inversion of arr
long long N=n;
return int(inversionCount(arr, N));
}
};