Acwing-----算法基础课之第一讲

785. 快速排序

#include <iostream>
using namespace std;
const int N = 1000010;
int q[N];

void quick_sort(int q[], int l, int r) {
    if (l >= r) return ;
    int x = q[(l + r) / 2], i = l - 1, j = r + 1;
    while (i < j) {
        do i++;while (q[i] < x);
        do j--;while (q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }
    quick_sort(q, l, j);
    quick_sort(q, j + 1, r);
}

int main() {
    int n;
    cin >> n;
    
    for (int i = 0; i < n; ++i) cin >> q[i];
    quick_sort(q, 0, n - 1);
    for (int i = 0; i < n; ++i) cout << q[i] << " ";
    puts("");
    
    return 0;
}

786. 第k个数

#include <iostream>
using namespace std;

const int N = 100010;
int n, k, q[N];

int quick_sort(int l, int r, int k) {
    if (l >= r) return q[l];
    
    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    
    while (i < j) {
        do i ++ ; while (q[i] < x);
        do j -- ; while (q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }
    
    int sl = j - l + 1;
    if (k <= sl) return quick_sort(l, j, k);
    return quick_sort(j + 1, r, k - sl);
}

int main() {
    scanf("%d%d", &n, &k);
    for (int i = 0; i < n; ++i) scanf("%d", &q[i]);
    cout << quick_sort(0, n - 1, k) << endl;
}

787. 归并排序

#include <iostream>
using namespace std;

const int N = 1e6 + 10;
int q[N], tmp[N], n;

void merge_sort(int q[], int l, int r) {
    if (l >= r) return;
    
    int mid = l + r >> 1;
    merge_sort(q, l, mid);
    merge_sort(q, mid + 1, r);
    
    int k = 0, i = l, j = mid + 1;
    
    while (i <= mid && j <= r) {
        if (q[i] < q[j]) tmp[k++] = q[i++];
        else tmp[k++] = q[j++];
    }
    
    while (i <= mid) tmp[k++] = q[i++];
    while (j <= r) tmp[k++] = q[j++];
    
    for (int i = l, j = 0; i <= r; i++, j++) q[i] = tmp[j]; 
}

int main () {
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) scanf("%d", &q[i]);
    merge_sort(q, 0, n - 1);
    for (int i = 0; i < n; ++i) printf("%d ", q[i]);
    return 0;
}

788. 逆序对的数量

#include <iostream>

using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int a[N], tmp[N];

LL merge_sort(int q[], int l, int r)
{
    if (l >= r) return 0;

    int mid = l + r >> 1;

    LL res = merge_sort(q, l, mid) + merge_sort(q, mid + 1, r);

    int k = 0, i = l, j = mid + 1;
    while (i <= mid && j <= r)
        if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
        else
        {
            res += mid - i + 1;
            tmp[k ++ ] = q[j ++ ];
        }
    while (i <= mid) tmp[k ++ ] = q[i ++ ];
    while (j <= r) tmp[k ++ ] = q[j ++ ];

    for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];

    return res;
}

int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);

    cout << merge_sort(a, 0, n - 1) << endl;

    return 0;
}

789. 数的范围

#include <iostream>
using namespace std;

const int N = 100010;
int q[N], m, n;

int main () {
    scanf("%d%d", &n, &m);
    
    for (int i = 0; i < n; ++i) scanf("%d", &q[i]);
    
    while (m--) {
        int x;
        scanf("%d", &x);
        
        int l = 0, r = n - 1;
        while (l < r) {
            int mid = l + r >> 1;
            if (q[mid] >= x) r = mid;
            else l = mid + 1;
        }
        if (q[l] != x) {
            cout << "-1 -1" << endl;
        } else {
            cout << l << " ";
            int l = 0, r = n - 1;
            while (l < r) {
                int  mid = l + r + 1 >> 1;
                if (q[mid] <= x) l = mid;
                else r = mid - 1;
            }
            cout << l << endl;
        }
    }
}

790. 数的三次方根

`#include <iostream>
using namespace std;

double n;

int main() {
    cin >> n;
    double l = -10000, r = 10000;
    while (r - l >= 1e-7) {
        double mid = (l + r) / 2;
        if (mid * mid * mid >= n) r = mid;
        else l = mid;
    }
    printf("%.6lf\n", l);
}

795. 前缀和

#include <iostream>
using namespace std;

const int N = 100010;

int n, m, q[N], s[N];

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        cin >> q[i];
        s[i] = s[i - 1] + q[i];
    }
    
    
    int a, b;
    for (int i = 0; i < m; ++i) {
        cin >> a >> b;
        cout << s[b] - s[a - 1] << endl;
    }
    return 0;
}
  1. 子矩阵的和
#include <iostream>
using namespace std;

const int N = 1010;
int n, m, q, s[N][N];

int main() {
    cin >> n >> m >> q;
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) cin >> s[i][j];
    }
    
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
    }
    
    while (q--) {
        int x1, x2, y1, y2;
        cin >> x1 >> y1 >> x2 >> y2;
        cout << s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1] << endl;
    }
}

799. 最长连续不重复子序列

#include <iostream>
using namespace std;

int n;
const int N = 100010;
int a[N], s[N];

int main() {
    cin >> n;
    for (int i = 0; i < n; ++i) cin >> a[i];
    int res = 0;
    
    for (int i = 0, j = 0; i < n; ++i) {
        s[a[i]]++;
        while (s[a[i]] > 1) {
            s[a[j]]--;
            j++;
        }
        res = max(res, i - j + 1);
    }
    cout << res << endl;
    return 0;
}

800. 数组元素的目标和

#include <iostream>
using namespace std;

const int N = 100010;
int n, m, x, a[N], b[N];

int main() {
    cin >> n >> m >> x;
    for (int i = 0; i < n; ++i) cin >> a[i];
    for (int i = 0; i < m; ++i) cin >> b[i];
    
    for (int i = 0, j = m - 1; i < n; ++i) {
        while (j >= 0 && a[i] + b[j] > x) j--;
        if (j >= 0 && a[i] + b[j] == x) cout << i << " " << j << endl;
    }
    return 0;
}

803. 区间合并

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
typedef pair<int, int> PII;
const int N = 100010;
int n;
vector<PII> segs;

void merge(vector<PII> &segs) {
    vector<PII> res;
    
    sort(segs.begin(), segs.end());
    int st = -2e9, ed = -2e9;
    for (auto seg: segs) {
        if (ed < seg.first) {
            if (st != -2e9) res.push_back({st, ed});
            st = seg.first, ed = seg.second;
        }
        else ed = max(ed, seg.second);
    }
    if (st != -2e9) res.push_back({st, ed});
    segs = res;
}

int main() {
    cin >> n;
    for (int i = 0; i < n; ++i) {
        int a, b;
        cin >> a >> b;
        segs.push_back({a, b});
    }
    
    merge(segs);
    cout << segs.size() << endl;
    return 0;
}
posted @ 2020-04-03 20:29  景云ⁿ  阅读(1707)  评论(0编辑  收藏  举报