Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- string addtwobigintegers(string &a, string &b) {
- string ans;
- int i = a.length() - 1, j = b.length() - 1, carry = 0;
- while (i >= 0 && j >= 0) {
- int sum = (a[i] - 48 + b[j] - 48 + carry);
- int tempadd = (sum % 10); //8
- carry = (sum / 10);//9
- ans.push_back(tempadd + 48);
- i--; j--;
- }
- while (i >= 0) {
- int sum = (a[i] - 48 + carry);
- int tempadd = (sum % 10);
- carry = (sum / 10);
- ans.push_back(tempadd + 48);
- i--;
- }
- while (j >= 0) {
- int sum = b[j] - 48 + carry;
- int tempadd = (sum % 10);
- carry = (sum / 10);
- ans.push_back(tempadd + 48);
- j--;
- }
- if (carry != 0) ans.push_back(carry + 48);
- reverse(ans.begin(), ans.end());
- // for (auto &i : ans )cout << i; cout << endl;
- //how to add two big integers
- //two pointers
- //comparison
- //exhausting i or j
- //carry forwarding
- return ans;
- }
- int minsubsequences(vector<int>& v, int n, int k) {
- sort(v.begin(), v.end());
- int count = 1, m = v[0];
- for (int i = 0; i < n; i++) {
- //curr i will act as M
- if ((v[i] - m) <= k) continue;
- else {
- count++;
- m = v[i];
- }
- }
- return count;
- }
- void merge(vector<int>&v, int start, int mid, int end, int &rpcount) {
- int i = start, j = mid + 1, k;
- while (i <= mid && j <= end) {
- if (v[i] > (2 * v[j])) {
- rpcount += (mid - i + 1);
- j++;
- }
- else i++;
- }
- i = start, j = mid + 1, k = 0;
- int temp[end - start + 1];
- while (i <= mid && j <= end) {
- if (v[i] < v[j]) {
- temp[k] = v[i];
- i++; k++;
- }
- else {
- temp[k] = v[j];
- j++; k++;
- }
- }
- while (i <= mid) {
- temp[k] = v[i];
- i++; k++;
- }
- while (j <= end) {
- temp[k] = v[j];
- j++; k++;
- }
- for (int i = start; i <= end; i++) {
- v[i] = temp[i - start];
- }
- }
- void dividenconquer(vector<int>&v, int start, int end, int &rpcount) {
- if (start < end) {
- int mid = (start + (end - start) / 2);
- dividenconquer(v, start, mid, rpcount);
- dividenconquer(v, mid + 1, end, rpcount);
- merge(v, start, mid, end, rpcount);
- }
- }
- int main() {
- //43 : 11 + 11 + 11 +10
- //564 :
- //99 :
- //909 :9
- // //adding two big integers
- // int n, k; cin >> n >> k;
- // vector<int> v(n);
- // for (auto&i : v) cin >> i;
- // int ans = minsubsequences(v, n, k);
- // cout << ans << endl;
- // int n, addrocks; cin >> n >> addrocks;
- // vector<int> capacity(n), rocks(n);
- // for (auto &i : capacity) cin >> i;
- // for (auto &i : rocks) cin >> i;
- // vector<int> needed(n);
- // for (int i = 0; i < n; i++) needed[i] = (capacity[i] - rocks[i]);
- // sort(needed.begin(), needed.end());
- // int tempsum = 0, ans = 0;
- // for (int i = 0; i < n; i++) {
- // tempsum += needed[i];
- // if (tempsum <= addrocks) {
- // ans = (i + 1);
- // }
- // else {
- // break;
- // }
- // }
- // cout << ans << endl;
- int n; cin >> n;
- vector<int> v(n);
- for (int i = 0; i < n; i++) cin >> v[i];
- int rpcount = 0;
- dividenconquer(v, 0, n - 1, rpcount);
- cout << rpcount << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement