Imran1107048

Template

Jan 4th, 2022 (edited)
1,037
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 27.62 KB | None | 0 0
  1. /**
  2.  
  3. Normal Template -------------------------------------------------------------51
  4. Chapter-1: Number Theory
  5.  
  6. Sieve (Prime) ---------------------------------------------------------------92
  7. Sum of all Divisors 1 to N –------------------------------------------------127
  8. nCr-------------------------------------------------------------------------141
  9. nPr-------------------------------------------------------------------------160
  10. GCD-------------------------------------------------------------------------173
  11. LCM-------------------------------------------------------------------------180
  12. Number Factorization--------------------------------------------------------187
  13. Base Conversion-------------------------------------------------------------246
  14. AND, OR, XOR----------------------------------------------------------------300
  15. Is Factorial of any number or not-------------------------------------------790
  16.  
  17. Chapter-2: Math
  18. Big Mod --------------------------------------------------------------------114
  19. Prefix Sum------------------------------------------------------------------201
  20. Minimum Sub array Sum-------------------------------------------------------543
  21. Maximum Sum of a given size Sub-array---------------------------------------560
  22. Fibonacci-------------------------------------------------------------------802
  23.  
  24. Chapter-3: Data Structures
  25. Segment Tree Efficient------------------------------------------------------700
  26. Sum of given range (Update any index value) --------------------------------726
  27. Range Minimum Query---------------------------------------------------------648
  28. Nearest Smaller Element-----------------------------------------------------580
  29. Nearest smaller numbers on left side----------------------------------------610
  30.  
  31. Chapter-4: Algorithm
  32. Binary Search---------------------------------------------------------------216
  33. DFS-------------------------------------------------------------------------313
  34. Mo's Algorithm--------------------------------------------------------------627
  35. Dijkstra (Bellman-Ford with Negative Edge) ---------------------------------350
  36. Fractional Knapsack --------------------------------------------------------452
  37. 0-1 Knapsack----------------------------------------------------------------412
  38. Longest Increasing Subsequence----------------------------------------------495
  39. Longest Common Subsequence -------------------------------------------------516
  40. Longest Common Subsequence of 3 --------------------------------------------528
  41. Bellman-Ford's single source shortest path----------------------------------847
  42. Floyd Warshall All Pairs Shortest Path--------------------------------------930
  43. Jobs sequence with deadlines and profits------------------------------------983
  44. Longest Palindromic Subsequence--------------------------------------------1040
  45. Count All Palindromic Subsequence in a given String------------------------1066
  46.  
  47. Chapter-6: Backtracking
  48. Printing all solutions in N-Queen Problem----------------------------------1090
  49. The Knight’s tour problem--------------------------------------------------1152
  50.  
  51. */
  52.  
  53.  
  54. /**
  55. *   Normal Template
  56. */
  57.  
  58. #include<bits/stdc++.h>
  59. using namespace std;
  60.  
  61. #define     IOS         ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  62. #define     int         long long
  63. #define     endl        "\n"
  64. #define     PI          acos(-1.0)
  65. #define     IN          freopen("input.txt",'r',stdin)
  66.  
  67. const int MOD = 1e9+7;
  68. const int INF = 2e5+5;
  69. const int N = 205;
  70.  
  71. void solve();
  72. int32_t main()
  73. {
  74.     IOS;
  75.     cout << fixed << setprecision(10);
  76.     int _ = 1;
  77.     cin >> _;
  78.     while(_--) solve();
  79.     return 0;
  80. }
  81.  
  82. void solve()
  83. {
  84.  
  85. }
  86.  
  87. ///Must see the constraints range
  88. ///Calculate the Time
  89.  
  90. /**
  91. *   Sieve Prime
  92. */
  93. vector<int>prime;
  94. bool ok[MOD];
  95.  
  96. void sieve()
  97. {
  98.     memset(ok, true, sizeof(ok));
  99.     prime.push_back(2);
  100.     ok[0] = ok[1] = false;
  101.     for(int i=3;i<=MOD;i+=2){
  102.         if(ok[i]){
  103.             prime.push_back(i);
  104.             if(i*1*i<=MOD){
  105.                 for(int ii=i*i;ii<=MOD;ii += (i+i)){
  106.                     ok[ii] = false;
  107.                 }
  108.             }
  109.         }
  110.     }
  111. }
  112.  
  113. /**
  114. *   Big Mod
  115. **/
  116. int BIGMOD(int b, int p)
  117. {
  118.     int ans = 1 % MOD, x = b % MOD;
  119.     while(p){
  120.         if(p&1)ans = (ans * x)%MOD;
  121.         x = (x*x)%MOD; p >>= 1LL;
  122.     }
  123.     return ans;
  124. }
  125.  
  126. /**
  127. *  Sum of all Divisors 1 to N
  128. */
  129. int sum_all_divisors(int num)
  130. {
  131.     int sum = 0;
  132.     for (int i = 1; i <= sqrt(num); i++) {
  133.         int t1 = i * (num / i - i + 1);
  134.         int t2 = (((num/i)*(num/i+1))/2) - ((i*(i+1))/2);
  135.         sum += t1 + t2;
  136.     }
  137.     return sum;
  138. }
  139.  
  140. /**
  141. *  nCr
  142. */
  143. void printNcR(int n, int r)
  144. {
  145.     long long p = 1, k = 1;
  146.     if (n - r < r)r = n - r;
  147.     if (r != 0) {
  148.         while (r) {
  149.             p *= n; k *= r;
  150.             long long m = __gcd(p, k);
  151.             p /= m; k /= m;
  152.             n--; r--;
  153.         }
  154.     }
  155.     else p = 1;
  156.     cout << p << endl;
  157. }
  158.  
  159. /**
  160. *  nPr
  161. */
  162. int fact(int n)
  163. {
  164.     if (n <= 1) return 1;
  165.     return n * fact(n - 1);
  166. }
  167. int nPr(int n, int r)
  168. {
  169.     return fact(n) / fact(n - r);
  170. }
  171.  
  172. /**
  173. *   GCD
  174. */
  175. int GCD(int a, int b){
  176.     return __gcd(a, b);
  177. }
  178.  
  179. /**
  180. *   LCM
  181. */
  182. int LCM(int a, int b){
  183.     return ((a*b) / (__gcd(a, b)));
  184. }
  185.  
  186. /**
  187. *   Number Factorization
  188. */
  189. int NumberOfFactor(int n)
  190. {
  191.     int cnt = 0;
  192.     for(int i=2;i<=sqrt(n);i++){
  193.         if(n%i == 0)
  194.             cnt++;
  195.         while(n%i == 0)
  196.             n /= i;
  197.     }
  198.     return cnt;
  199. }
  200.  
  201. /**
  202. *   Prefix Sum
  203. */
  204. void PrefixSum(int a[], int n)
  205. {
  206.     ///Just sum all the value of it's previous index
  207.  
  208.     int sum[n];
  209.     sum[0] = a[0];
  210.     for(int i=1;i<n;i++){
  211.         sum[i] = sum[i-1] + a[i];
  212.     }
  213. }
  214.  
  215. /**
  216. *   Binary Search
  217. */
  218.  
  219. ///array search with an value
  220. ///return bool value
  221. ///sort(a, a+n);
  222. ///binary_search(a, a + 10, 2);
  223.  
  224.  
  225. ///Vector
  226. ///return bool value
  227. ///binary_search(arr.begin(), arr.end(), 15);
  228.  
  229. ///Iterative way
  230. int binarySearch(int arr[], int l, int r, int x)
  231. {
  232.     while (l <= r) {
  233.         int m = l + (r - l) / 2;
  234.         if (arr[m] == x)
  235.             return m;
  236.         if (arr[m] < x)
  237.             l = m + 1;
  238.         else
  239.             r = m - 1;
  240.     }
  241.     return -1;
  242. }
  243. ///int result = binarySearch(array, starting, ending, finding value);
  244.  
  245. /**
  246. *   Base Conversion
  247. */
  248. int val(char c)
  249. {
  250.     if (c >= '0' && c <= '9')
  251.         return (int)c - '0';
  252.     else
  253.         return (int)c - 'A' + 10;
  254. }
  255. int toDeci(string str, int base)
  256. {
  257.     int len = str.size();
  258.     int power = 1;
  259.     int num = 0;
  260.     for (int i = len - 1; i >= 0; i--) {
  261.         if (val(str[i]) >= base) {
  262.             printf("Invalid Number");
  263.             return -1;
  264.         }
  265.         num += val(str[i]) * power;
  266.         power = power * base;
  267.     }
  268.  
  269.     return num;
  270. }
  271. char reVal(int num)
  272. {
  273.     if (num >= 0 && num <= 9)
  274.         return (char)(num + '0');
  275.     else
  276.         return (char)(num - 10 + 'A');
  277. }
  278. string fromDeci(int base, int inputNum)
  279. {
  280.     string res = "";
  281.     while (inputNum > 0) {
  282.         res += reVal(inputNum % base);
  283.         inputNum /= base;
  284.     }
  285.     reverse(res.begin(), res.end());
  286.     return res;
  287. }
  288. void convertBase(string s, int a, int b)
  289. {
  290.     int num = toDeci(s, a);
  291.     string ans = fromDeci(b, num);
  292.     cout << ans;
  293. }
  294.  
  295. ///convertBase(string input, from base, to base);
  296.  
  297.  
  298. /**
  299. *   AND, OR, XOR
  300. */
  301.  
  302. ///Number of leading zeroes: builtin_clz(x)
  303. ///Number of trailing zeroes : builtin_ctz(x)
  304. ///Number of 1-bits: __builtin_popcount(x)
  305.  
  306. ///Bitwise AND (&)
  307. ///Bitwise OR (|)
  308. ///Bitwise XOR (^)
  309. ///Bitwise NOT (!)
  310.  
  311.  
  312. /**
  313. *   DFS
  314. */
  315. void addEdge(vector<int> adj[], int u, int v)
  316. {
  317.     adj[u].push_back(v);
  318.     adj[v].push_back(u);
  319. }
  320.  
  321. void DFSUtil(int u, vector<int> adj[],
  322.                     vector<bool> &visited)
  323. {
  324.     visited[u] = true;
  325.     cout << u << " ";
  326.     for (int i=0; i<adj[u].size(); i++)
  327.         if (visited[adj[u][i]] == false)
  328.             DFSUtil(adj[u][i], adj, visited);
  329. }
  330.  
  331. void DFS(vector<int> adj[], int V)
  332. {
  333.     vector<bool> visited(V, false);
  334.     for (int u=0; u<V; u++)
  335.         if (visited[u] == false)
  336.             DFSUtil(u, adj, visited);
  337. }
  338. /**
  339.     int V = 5;
  340.     vector<int> adj[V];
  341.     addEdge(adj, 0, 1);
  342.     DFS(adj, V);
  343. */
  344.  
  345.  
  346. /**
  347. *   Dijkstra (Bellman-Ford with Negative Edge)
  348. */
  349.  
  350. class Graph
  351. {
  352.     int V;
  353.     list< pair<int, int> > *adj;
  354.  
  355. public:
  356.     Graph(int V);
  357.     void addEdge(int u, int v, int w);
  358.     void shortestPath(int s);
  359. };
  360.  
  361. Graph::Graph(int V)
  362. {
  363.     this->V = V;
  364.     adj = new list< pair<int, int> >[V];
  365. }
  366.  
  367. void Graph::addEdge(int u, int v, int w)
  368. {
  369.     adj[u].push_back(make_pair(v, w));
  370.     adj[v].push_back(make_pair(u, w));
  371. }
  372.  
  373. void Graph::shortestPath(int src)
  374. {
  375.     set< pair<int, int> > setds;
  376.     vector<int> dist(V, INF);
  377.     setds.insert(make_pair(0, src));
  378.     dist[src] = 0;
  379.     while (!setds.empty())
  380.     {
  381.         pair<int, int> tmp = *(setds.begin());
  382.         setds.erase(setds.begin());
  383.         int u = tmp.second;
  384.         list< pair<int, int> >::iterator i;
  385.         for (i = adj[u].begin(); i != adj[u].end(); ++i)
  386.         {
  387.             int v = (*i).first;
  388.             int weight = (*i).second;
  389.             if (dist[v] > dist[u] + weight)
  390.             {
  391.                 if (dist[v] != INF)
  392.                     setds.erase(setds.find(make_pair(dist[v], v)));
  393.                 dist[v] = dist[u] + weight;
  394.                 setds.insert(make_pair(dist[v], v));
  395.             }
  396.         }
  397.     }
  398.     printf("Vertex Distance from Source\n");
  399.     for (int i = 0; i < V; ++i)
  400.         printf("%d \t\t %d\n", i, dist[i]);
  401. }
  402.  
  403. lol_main()
  404. {
  405.     int V = 9;
  406.     Graph g(V);
  407.     g.addEdge(0, 1, 4);
  408.     g.shortestPath(0);
  409. }
  410.  
  411. /**
  412. *   0-1 Knapsack
  413. */
  414.  
  415. int knapSack(int W, int wt[], int val[], int n)
  416. {
  417.     int i, w;
  418.     int K[2][W + 1];
  419.     for (i = 0; i <= n; i++) {
  420.         for (w = 0; w <= W; w++) {
  421.             if (i == 0 || w == 0)
  422.                 K[i % 2][w] = 0;
  423.             else if (wt[i - 1] <= w)
  424.                 K[i % 2][w] = max(
  425.                     val[i - 1]
  426.                         + K[(i - 1) % 2][w - wt[i - 1]],
  427.                     K[(i - 1) % 2][w]);
  428.             else
  429.                 K[i % 2][w] = K[(i - 1) % 2][w];
  430.         }
  431.     }
  432.     return K[n % 2][W];
  433. }
  434.  
  435. int knapSack(int W, int wt[], int val[], int n)
  436. {
  437.     int dp[W + 1];
  438.     memset(dp, 0, sizeof(dp));
  439.  
  440.     for (int i = 1; i < n + 1; i++) {
  441.         for (int w = W; w >= 0; w--) {
  442.             if (wt[i - 1] <= w)
  443.                 dp[w] = max(dp[w], dp[w - wt[i - 1]] + val[i - 1]);
  444.         }
  445.     }
  446.     return dp[W];
  447. }
  448.  
  449. ///Knapsack(Capacity, Weight, Value, Item Size)
  450.  
  451. /**
  452. *   Fractional Knapsack
  453. */
  454. struct Item {
  455.     int value, weight;
  456.     Item(int value, int weight)
  457.     {
  458.        this->value=value;
  459.        this->weight=weight;
  460.     }
  461. };
  462. bool cmp(struct Item a, struct Item b)
  463. {
  464.     double r1 = (double)a.value / (double)a.weight;
  465.     double r2 = (double)b.value / (double)b.weight;
  466.     return r1 > r2;
  467. }
  468.  
  469. double fractionalKnapsack(int W, struct Item arr[], int n)
  470. {
  471.     sort(arr, arr + n, cmp);
  472.  
  473.     int curWeight = 0;
  474.     double finalvalue = 0.0;
  475.     for (int i = 0; i < n; i++) {
  476.         if (curWeight + arr[i].weight <= W) {
  477.             curWeight += arr[i].weight;
  478.             finalvalue += arr[i].value;
  479.         }
  480.         else {
  481.             int remain = W - curWeight;
  482.             finalvalue += arr[i].value * ((double)remain / (double)arr[i].weight);
  483.             break;
  484.         }
  485.     }
  486.     return finalvalue;
  487. }
  488.  
  489. ///Item arr[] = { { 60, 10 }, { 100, 20 }, { 120, 30 } };
  490. ///fractionalKnapsack(W, arr, n);
  491.  
  492.  
  493. /**
  494. *   Longest Increasing Subsequence
  495. */
  496. int LongestIncreasingSubsequenceLength(vector<int>& v)
  497. {
  498.     if (v.size() == 0)
  499.         return 0;
  500.     vector<int> tail(v.size(), 0);
  501.     int length = 1;
  502.     tail[0] = v[0];
  503.     for (int i = 1; i < v.size(); i++) {
  504.         auto b = tail.begin(), e = tail.begin() + length;
  505.         auto it = lower_bound(b, e, v[i]);
  506.         if (it == tail.begin() + length)
  507.             tail[length++] = v[i];
  508.         else
  509.             *it = v[i];
  510.     }
  511.     return length;
  512. }
  513.  
  514.  
  515. /**
  516. *   Longest Common Subsequence
  517. */
  518. int lcs( char *X, char *Y, int m, int n )
  519. {
  520.     if (m == 0 || n == 0)
  521.         return 0;
  522.     if (X[m-1] == Y[n-1])
  523.         return 1 + lcs(X, Y, m-1, n-1);
  524.     else
  525.         return max(lcs(X, Y, m, n-1), lcs(X, Y, m-1, n));
  526. }
  527.  
  528. int lcsOf3(int i, int j,int k)
  529. {
  530.     if(i==-1||j==-1||k==-1)
  531.         return 0;
  532.     if(dp[i][j][k]!=-1)
  533.         return dp[i][j][k];
  534.  
  535.     if(X[i]==Y[j] && Y[j]==Z[k])
  536.         return dp[i][j][k] = 1+lcsOf3(i-1,j-1,k-1);
  537.     else
  538.         return dp[i][j][k] = max(max(lcsOf3(i-1,j,k), lcsOf3(i,j-1,k)),lcsOf3(i,j,k-1));
  539. }
  540.  
  541.  
  542. /**
  543. *   Minimum Sub Array Sum
  544. */
  545. int smallestSumSubarr(int arr[], int n)
  546. {
  547.     int min_ending_here = INT_MAX;
  548.     int min_so_far = INT_MAX;
  549.     for (int i=0; i<n; i++){
  550.         if (min_ending_here > 0)
  551.             min_ending_here = arr[i];
  552.         else
  553.             min_ending_here += arr[i];
  554.         min_so_far = min(min_so_far, min_ending_here);
  555.     }
  556.     return min_so_far;
  557. }
  558.  
  559. /**
  560. *   Maximum Sum of a given size Sub-array
  561. */
  562. int maxSum(int arr[], int n, int k)
  563. {
  564.     if (n < k){
  565.        cout << "Invalid";
  566.        return -1;
  567.     }
  568.     int res = 0;
  569.     for (int i=0; i<k; i++)
  570.        res += arr[i];
  571.     int curr_sum = res;
  572.     for (int i=k; i<n; i++){
  573.        curr_sum += arr[i] - arr[i-k];
  574.        res = max(res, curr_sum);
  575.     }
  576.  
  577.     return res;
  578. }
  579.  
  580. /**
  581. *   Nearest Smaller Element
  582. */
  583. void printNSE(int arr[], int n)
  584. {
  585.     stack<pair<int, int> > s;
  586.     vector<int> ans(n);
  587.     for (int i = 0; i < n; i++) {
  588.         int next = arr[i];
  589.         if (s.empty()) {
  590.             s.push({ next, i });
  591.             continue;
  592.         }
  593.         while (!s.empty() && s.top().first > next) {
  594.             ans[s.top().second] = next;
  595.             s.pop();
  596.         }
  597.  
  598.         s.push({ next, i });
  599.     }
  600.     while (!s.empty()) {
  601.         ans[s.top().second] = -1;
  602.         s.pop();
  603.     }
  604.     for (int i = 0; i < n; i++) {
  605.         cout << arr[i] << " ---> " << ans[i] << endl;
  606.     }
  607. }
  608.  
  609. /**
  610. *   Nearest smaller numbers on left side
  611. */
  612. nearest smaller numbers on left side
  613. void printPrevSmaller(int arr[], int n)
  614. {
  615.     stack<int> S;
  616.     for (int i=0; i<n; i++)
  617.     {
  618.         while (!S.empty() && S.top() >= arr[i])
  619.             S.pop();
  620.         if (S.empty()) cout << "_, ";
  621.         else cout << S.top() << ", ";
  622.         S.push(arr[i]);
  623.     }
  624. }
  625.  
  626. /**
  627. *   Mo's Algorithm
  628. */
  629. struct Query
  630. {
  631.     int L, R;
  632. };
  633.  
  634. void printQuerySums(int a[], int n, Query q[], int m)
  635. {
  636.     for (int i=0; i<m; i++)
  637.     {
  638.         int L = q[i].L, R = q[i].R;
  639.         int sum = 0;
  640.         for (int j=L; j<=R; j++)
  641.             sum += a[j];
  642.         cout << "Sum of [" << L << ", "
  643.             << R << "] is "  << sum << endl;
  644.     }
  645. }
  646.  
  647. /**
  648. *   Range Minimum Query
  649. */
  650. int lookup[MAX][MAX];
  651.  
  652. struct Query {
  653.     int L, R;
  654. };
  655. void preprocess(int arr[], int n)
  656. {
  657.     for (int i = 0; i < n; i++)
  658.         lookup[i][0] = i;
  659.     for (int j = 1; (1 << j) <= n; j++){
  660.         for (int i = 0; (i + (1 << j) - 1) < n; i++){
  661.             if (arr[lookup[i][j - 1]] < arr[lookup[i + (1 << (j - 1))][j - 1]])
  662.                 lookup[i][j] = lookup[i][j - 1];
  663.             else
  664.                 lookup[i][j] = lookup[i + (1 << (j - 1))][j - 1];
  665.         }
  666.     }
  667. }
  668. int query(int arr[], int L, int R)
  669. {
  670.     int j = (int)log2(R - L + 1);
  671.     if (arr[lookup[L][j]] <= arr[lookup[R - (1 << j) + 1][j]])
  672.         return arr[lookup[L][j]];
  673.     else
  674.         return arr[lookup[R - (1 << j) + 1][j]];
  675. }
  676. void RMQ(int arr[], int n, Query q[], int m)
  677. {
  678.     preprocess(arr, n);
  679.     for (int i = 0; i < m; i++)
  680.     {
  681.         int L = q[i].L, R = q[i].R;
  682.         cout << "Minimum of [" << L << ", " << R << "] is " << query(arr, L, R) << endl;
  683.     }
  684. }
  685. int main()
  686. {
  687.     int a[] = { 7, 2, 3, 0, 5, 10, 3, 12, 18 };
  688.     int n = sizeof(a) / sizeof(a[0]);
  689.     Query q[] = { { 0, 4 }, { 4, 7 }, { 7, 8 } };
  690.     int m = sizeof(q) / sizeof(q[0]);
  691.     RMQ(a, n, q, m);
  692.     return 0;
  693. }
  694.  
  695. /**
  696. *   Segment Tree Efficient
  697. */
  698. int n;
  699. int tree[2 * N];
  700. void build( int arr[]){
  701.     for (int i=0; i<n; i++) tree[n+i] = arr[i];
  702.     for (int i = n - 1; i > 0; --i)
  703.         tree[i] = tree[i<<1] + tree[i<<1 | 1];
  704. }
  705. void updateTreeNode(int p, int value){
  706.     tree[p+n] = value; p = p+n;
  707.     for (int i=p; i > 1; i >>= 1)
  708.         tree[i>>1] = tree[i] + tree[i^1];
  709. }
  710. int query(int l, int r){
  711.     int res = 0;
  712.     for (l += n, r += n; l < r; l >>= 1, r >>= 1){
  713.         if (l&1) res += tree[l++];
  714.         if (r&1) res += tree[--r];
  715.     }
  716.     return res;
  717. }
  718. int main(){
  719.     int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
  720.     build(a);
  721.     updateTreeNode(2, 1);
  722.     cout << query(1, 3)<<endl;
  723. }
  724.  
  725. /**
  726. *   Sum of given range (Update any index value)
  727. */
  728. int getMid(int s, int e) { return s + (e -s)/2; }
  729.  
  730. int getSumUtil(int *st, int ss, int se, int qs, int qe, int si){
  731.     if (qs <= ss && qe >= se) return st[si];
  732.     if (se < qs || ss > qe) return 0;
  733.     int mid = getMid(ss, se);
  734.     return getSumUtil(st, ss, mid, qs, qe, 2*si+1) + getSumUtil(st, mid+1, se, qs, qe, 2*si+2);
  735. }
  736. void updateValueUtil(int *st, int ss, int se, int i, int diff, int si){
  737.     if (i < ss || i > se) return;
  738.     st[si] = st[si] + diff;
  739.     if (se != ss){
  740.         int mid = getMid(ss, se);
  741.         updateValueUtil(st, ss, mid, i, diff, 2*si + 1);
  742.         updateValueUtil(st, mid+1, se, i, diff, 2*si + 2);
  743.     }
  744. }
  745. void updateValue(int arr[], int *st, int n, int i, int new_val){
  746.     if (i < 0 || i > n-1)
  747.     {
  748.         cout<<"Invalid Input";
  749.         return;
  750.     }
  751.     int diff = new_val - arr[i];
  752.     arr[i] = new_val;
  753.     updateValueUtil(st, 0, n-1, i, diff, 0);
  754. }
  755. int getSum(int *st, int n, int qs, int qe){
  756.     if (qs < 0 || qe > n-1 || qs > qe) {
  757.         cout<<"Invalid Input"; return -1;
  758.     } return getSumUtil(st, 0, n-1, qs, qe, 0);
  759. }
  760. int constructSTUtil(int arr[], int ss, int se, int *st, int si){
  761.     if (ss == se) {
  762.         st[si] = arr[ss];
  763.         return arr[ss];
  764.     }
  765.     int mid = getMid(ss, se);
  766.     st[si] = constructSTUtil(arr, ss, mid, st, si*2+1) +
  767.                 constructSTUtil(arr, mid+1, se, st, si*2+2);
  768.     return st[si];
  769. }
  770. int *constructST(int arr[], int n){
  771.     int x = (int)(ceil(log2(n)));
  772.     int max_size = 2*(int)pow(2, x) - 1;
  773.     int *st = new int[max_size];
  774.     constructSTUtil(arr, 0, n-1, st, 0);
  775.     return st;
  776. }
  777.  
  778. int main(){
  779.     int arr[] = {1, 3, 5, 7, 9, 11};
  780.     int n = sizeof(arr)/sizeof(arr[0]);
  781.     int *st = constructST(arr, n);
  782.     cout<<"Sum of values in given range = "<<getSum(st, n, 1, 3)<<endl;
  783.     updateValue(arr, st, n, 1, 10);
  784.     cout<<"Updated sum of values in given range = " <<getSum(st, n, 1, 3)<<endl;
  785.     return 0;
  786. }
  787.  
  788. /**
  789. *   Is Factorial of any number or not
  790. */
  791. bool isFactorial(int n){
  792.   for (int i = 1;; i++) {
  793.     if (n % i == 0) n /= i;
  794.     else break;
  795.   }
  796.   if (n == 1) return true;
  797.   else return false;
  798. }
  799.  
  800.  
  801. /**
  802. *   Fibonacci
  803. */
  804. ll I[N][N],T[N][N];
  805.  
  806. void mul(ll A[][N],ll B[][N],ll dim){
  807.     ll res[dim+1][dim+1];
  808.     for(ll i=0;i<dim;i++)
  809.     {
  810.         for(ll j=0;j<dim;j++)
  811.         {
  812.             res[i][j]=0;
  813.             for(ll k=0;k<dim;k++)
  814.             {
  815.                 ll x=(A[i][k]*B[k][j])%mod;
  816.                 res[i][j]=(res[i][j]+x)%mod;
  817.             }
  818.         }
  819.     }
  820.     for(ll i=0;i<2;i++)
  821.     {
  822.         for(ll j=0;j<2;j++)A[i][j]=res[i][j];
  823.     }
  824. }
  825. void solve(ll a,ll b,ll n){
  826.     I[0][0]=I[1][1]=1;
  827.     I[0][1]=I[1][0]=0;
  828.  
  829.     T[0][0]=0;
  830.     T[0][1]=T[1][0]=T[1][1]=1;
  831.     n--;
  832.     while(n){
  833.         if(n%2==1){
  834.             mul(I,T,2);
  835.             n--;
  836.         }
  837.         else{
  838.             mul(T,T,2);
  839.             n/=2;
  840.         }
  841.     }
  842.     ll ans=a*I[0][1]+b*I[1][1];
  843.     cout<<ans%mod<<nl;
  844. }
  845.  
  846. /**
  847. *   Bellman-Ford's single source shortest path
  848. */
  849. #include <bits/stdc++.h>
  850. struct Edge {
  851.     int src, dest, weight;
  852. };
  853.  
  854. struct Graph {
  855.     int V, E;
  856.     struct Edge* edge;
  857. };
  858.  
  859. struct Graph* createGraph(int V, int E){
  860.     struct Graph* graph = new Graph;
  861.     graph->V = V;
  862.     graph->E = E;
  863.     graph->edge = new Edge[E];
  864.     return graph;
  865. }
  866.  
  867. void printArr(int dist[], int n)
  868. {
  869.     printf("Vertex Distance from Source\n");
  870.     for (int i = 0; i < n; ++i)
  871.         printf("%d \t\t %d\n", i, dist[i]);
  872. }
  873.  
  874. /// The main function that finds shortest distances from source
  875. /// to all other vertices using Bellman-Ford algorithm. The
  876. /// function also detects negative weight cycle
  877. void BellmanFord(struct Graph* graph, int src)
  878. {
  879.     int V = graph->V;
  880.     int E = graph->E;
  881.     int dist[V];
  882.     /// Step 1: Initialize distances from source to all other
  883.     /// Vertice's's as INFINITE
  884.     for (int i = 0; i < V; i++)
  885.         dist[i] = INT_MAX;
  886.     dist[src] = 0;
  887.     /// Step 2: Relax all edges |V| - 1 times. A simple
  888.     /// shortest path from source to any other vertex can have
  889.     /// at-most |V| - 1 edges
  890.     for (int i = 1; i <= V - 1; i++) {
  891.         for (int j = 0; j < E; j++) {
  892.             int u = graph->edge[j].src;
  893.             int v = graph->edge[j].dest;
  894.             int weight = graph->edge[j].weight;
  895.             if (dist[u] != INT_MAX && dist[u] + weight < dist[v])
  896.                 dist[v] = dist[u] + weight;
  897.         }
  898.     }
  899.  
  900.     /// Step 3: check for negative-weight cycles. The above
  901.     /// step guarantees shortest distances if graph doesn't
  902.     /// contain negative weight cycle. If we get a shorter
  903.     /// path, then there is a cycle.
  904.     for (int i = 0; i < E; i++) {
  905.         int u = graph->edge[i].src;
  906.         int v = graph->edge[i].dest;
  907.         int weight = graph->edge[i].weight;
  908.         if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) {
  909.             printf("Graph contains negative weight cycle");
  910.             return;
  911.         }
  912.     }
  913.     printArr(dist, V);
  914. }
  915.  
  916. int main()
  917. {
  918.     int V = 5; /// Number of vertices in graph
  919.     int E = 8; /// Number of edges in graph
  920.     struct Graph* graph = createGraph(V, E);
  921.  
  922.     /// add edge 0-1 (or A-B in above figure)
  923.     graph->edge[0].src = 0;
  924.     graph->edge[0].dest = 1;
  925.     graph->edge[0].weight = -1;
  926.  
  927.     BellmanFord(graph, 0);
  928. }
  929.  
  930. /**
  931. *   Floyd Warshall All Pairs Shortest Path
  932. */
  933.  
  934. void printSolution(int dist[][V]);
  935.  
  936. void floydWarshall(int graph[][V])
  937. {
  938.     int dist[V][V], i, j, k;
  939.  
  940.     for (i = 0; i < V; i++)
  941.         for (j = 0; j < V; j++)
  942.             dist[i][j] = graph[i][j];
  943.  
  944.     for (k = 0; k < V; k++) {
  945.         for (i = 0; i < V; i++) {
  946.             for (j = 0; j < V; j++) {
  947.                 if (dist[i][j] > (dist[i][k] + dist[k][j]) && (dist[k][j] != INF
  948.                                 && dist[i][k] != INF))
  949.                     dist[i][j] = dist[i][k] + dist[k][j];
  950.             }
  951.         }
  952.     }
  953.     printSolution(dist);
  954. }
  955.  
  956. void printSolution(int dist[][V])
  957. {
  958.     cout << "The following matrix shows the shortest " "distances"
  959.             " between every pair of vertices \n";
  960.     for (int i = 0; i < V; i++) {
  961.         for (int j = 0; j < V; j++) {
  962.             if (dist[i][j] == INF)
  963.                 cout << "INF" << "     ";
  964.             else
  965.                 cout << dist[i][j] << "     ";
  966.         }
  967.         cout << endl;
  968.     }
  969. }
  970.  
  971. int main()
  972. {
  973.     int graph[V][V] = { { 0, 5, INF, 10 },
  974.                         { INF, 0, 3, INF },
  975.                         { INF, INF, 0, 1 },
  976.                         { INF, INF, INF, 0 } };
  977.  
  978.     floydWarshall(graph);
  979.     return 0;
  980. }
  981.  
  982. /**
  983. *   Jobs sequence with deadlines and profits
  984. */
  985. struct Job{
  986.     char id;
  987.     int deadLine, profit;
  988. };
  989. struct DisjointSet{
  990.     int *parent;
  991.     DisjointSet(int n){
  992.         parent = new int[n+1];
  993.         for (int i = 0; i <= n; i++)
  994.             parent[i] = i;
  995.     }
  996.     int find(int s){
  997.         if (s == parent[s])
  998.             return s;
  999.         return parent[s] = find(parent[s]);
  1000.     }
  1001.     void merge(int u, int v){
  1002.         parent[v] = u;
  1003.     }
  1004. };
  1005. bool cmp(Job a, Job b){
  1006.     return (a.profit > b.profit);
  1007. }
  1008. int findMaxDeadline(struct Job arr[], int n)
  1009. {
  1010.     int ans = INT_MIN;
  1011.     for (int i = 0; i < n; i++)
  1012.         ans = max(ans, arr[i].deadLine);
  1013.     return ans;
  1014. }
  1015.  
  1016. int printJobScheduling(Job arr[], int n)
  1017. {
  1018.     sort(arr, arr + n, cmp);
  1019.     int maxDeadline = findMaxDeadline(arr, n);
  1020.     DisjointSet ds(maxDeadline);
  1021.     for (int i = 0; i < n; i++){
  1022.         int availableSlot = ds.find(arr[i].deadLine);
  1023.         if (availableSlot > 0){
  1024.             ds.merge(ds.find(availableSlot - 1), availableSlot);
  1025.             cout << arr[i].id << " ";
  1026.         }
  1027.     }
  1028. }
  1029.  
  1030. int main()
  1031. {
  1032.     Job arr[] = { { 'a', 2, 100 }, { 'b', 1, 19 }, { 'c', 2, 27 }, { 'd', 1, 25 },
  1033.                 { 'e', 3, 15 } };
  1034.     int n = sizeof(arr) / sizeof(arr[0]);
  1035.     cout << "Following jobs need to be " << "executed for maximum profit\n";
  1036.     printJobScheduling(arr, n);
  1037.     return 0;
  1038. }
  1039.  
  1040. /**
  1041. *   Longest Palindromic Subsequence
  1042. */
  1043. int lps(char *str)
  1044. {
  1045.     int n = strlen(str);
  1046.     int i, j, cl;
  1047.     int L[n][n];
  1048.     for (i = 0; i < n; i++)
  1049.       L[i][i] = 1;
  1050.  
  1051.     for (cl=2; cl<=n; cl++){
  1052.         for (i=0; i<n-cl+1; i++){
  1053.             j = i+cl-1;
  1054.             if (str[i] == str[j] && cl == 2)
  1055.                L[i][j] = 2;
  1056.             else if (str[i] == str[j])
  1057.                L[i][j] = L[i+1][j-1] + 2;
  1058.             else
  1059.                L[i][j] = max(L[i][j-1], L[i+1][j]);
  1060.         }
  1061.     }
  1062.     return L[0][n-1];
  1063. }
  1064.  
  1065. /**
  1066. *   Count All Palindromic Subsequence in a given String
  1067. */
  1068. int n, dp[1000][1000];
  1069. string str = "abcb";
  1070.  
  1071. int countPS(int i, int j)
  1072. {
  1073.     if (i > j)
  1074.         return 0;
  1075.     if (dp[i][j] != -1)
  1076.         return dp[i][j];
  1077.     if (i == j)
  1078.         return dp[i][j] = 1;
  1079.     else if (str[i] == str[j])
  1080.         return dp[i][j] = countPS(i + 1, j) + countPS(i, j - 1) + 1;
  1081.     else
  1082.         return dp[i][j] = countPS(i + 1, j) + countPS(i, j - 1) - countPS(i + 1, j - 1);
  1083. }
  1084.  
  1085. ///memset(dp, -1, sizeof(dp));
  1086. ///countPS(0, n - 1) << endl;
  1087.  
  1088.  
  1089. /**
  1090. *   Printing all solutions in N-Queen Problem
  1091. */
  1092. vector<vector<int> > result;
  1093. void solveBoard(vector<vector<char> >& board, int row,
  1094.                 int rowmask, int ldmask, int rdmask, int& ways)
  1095. {
  1096.     int n = board.size();
  1097.     int all_rows_filled = (1 << n) - 1;
  1098.     if (rowmask == all_rows_filled) {
  1099.  
  1100.         vector<int> v;
  1101.         for (int i = 0; i < board.size(); i++) {
  1102.             for (int j = 0; j < board.size(); j++) {
  1103.                 if (board[i][j] == 'Q')
  1104.                     v.push_back(j + 1);
  1105.             }
  1106.         }
  1107.         result.push_back(v);
  1108.         return;
  1109.     }
  1110.  
  1111.     int safe = all_rows_filled & (~(rowmask | ldmask | rdmask));
  1112.     while (safe) {
  1113.         int p = safe & (-safe);
  1114.         int col = (int)log2(p);
  1115.         board[row][col] = 'Q';
  1116.  
  1117.         solveBoard(board, row + 1, rowmask | p, (ldmask | p) << 1, (rdmask | p) >> 1, ways);
  1118.         safe = safe & (safe - 1);
  1119.         board[row][col] = ' ';
  1120.     }
  1121.     return;
  1122. }
  1123.  
  1124.  
  1125. int main()
  1126. {
  1127.     int n = 4;
  1128.     int ways = 0;
  1129.  
  1130.     vector<vector<char> > board;
  1131.     for (int i = 0; i < n; i++) {
  1132.         vector<char> tmp;
  1133.         for (int j = 0; j < n; j++) {
  1134.             tmp.push_back(' ');
  1135.         }
  1136.         board.push_back(tmp);
  1137.     }
  1138.     int rowmask = 0, ldmask = 0, rdmask = 0;
  1139.     int row = 0;
  1140.     result.clear();
  1141.     solveBoard(board, row, rowmask, ldmask, rdmask, ways);
  1142.     sort(result.begin(),result.end());
  1143.     for (auto ar : result) {
  1144.         cout << "[";
  1145.         for (auto it : ar) cout << it << " ";
  1146.         cout << "]";
  1147.     }
  1148.     return 0;
  1149. }
  1150.  
  1151. /**
  1152. *   The Knight’s tour problem
  1153. */
  1154. #define N 8
  1155.  
  1156. int solveKTUtil(int x, int y, int movei, int sol[N][N],
  1157.                 int xMove[], int yMove[]);
  1158.  
  1159. int isSafe(int x, int y, int sol[N][N]){
  1160.     return (x >= 0 && x < N && y >= 0 && y < N && sol[x][y] == -1);
  1161. }
  1162.  
  1163. void printSolution(int sol[N][N])
  1164. {
  1165.     for (int x = 0; x < N; x++) {
  1166.         for (int y = 0; y < N; y++)
  1167.             cout << " " << setw(2) << sol[x][y] << " ";
  1168.         cout << endl;
  1169.     }
  1170. }
  1171.  
  1172. int solveKT()
  1173. {
  1174.     int sol[N][N];
  1175.     for (int x = 0; x < N; x++)
  1176.         for (int y = 0; y < N; y++)
  1177.             sol[x][y] = -1;
  1178.     int xMove[8] = { 2, 1, -1, -2, -2, -1, 1, 2 };
  1179.     int yMove[8] = { 1, 2, 2, 1, -1, -2, -2, -1 };
  1180.     sol[0][0] = 0;
  1181.     if (solveKTUtil(0, 0, 1, sol, xMove, yMove) == 0) {
  1182.         cout << "Solution does not exist";
  1183.         return 0;
  1184.     }
  1185.     else
  1186.         printSolution(sol);
  1187.     return 1;
  1188. }
  1189.  
  1190. int solveKTUtil(int x, int y, int movei, int sol[N][N],
  1191.                 int xMove[8], int yMove[8])
  1192. {
  1193.     int k, next_x, next_y;
  1194.     if (movei == N * N) return 1;
  1195.     for (k = 0; k < 8; k++) {
  1196.         next_x = x + xMove[k];
  1197.         next_y = y + yMove[k];
  1198.         if (isSafe(next_x, next_y, sol)) {
  1199.             sol[next_x][next_y] = movei;
  1200.             if (solveKTUtil(next_x, next_y, movei + 1, sol, xMove, yMove) == 1)
  1201.                 return 1;
  1202.             else
  1203.                 sol[next_x][next_y] = -1;
  1204.         }
  1205.     }
  1206.     return 0;
  1207. }
  1208.  
  1209. int main(){
  1210.     solveKT();
  1211.     return 0;
  1212. }
  1213.  
Add Comment
Please, Sign In to add comment