基础算法

  1. 快排

    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    const int N = 1e5 + 10;
    int a[N];
    
    void qsort(int left, int right) {
        int l = left, r = right;
        int mid = a[l + r >> 1];
        while(l < r) {
            while(a[l] < mid) l++;
            while(a[r] > mid) r--;
            if(l <= r) swap(a[l++], a[r--]);
        }
        if(left < r) qsort(left, r);
        if(l < right) qsort(l, right);
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n;
        cin >> n;
        for(int i = 0; i < n; i++) cin >> a[i];
        qsort(0, n - 1);
        for(int i = 0; i < n; i++) cout << a[i] << ' ';
        return 0;
    }
  2. 高精度加法

    #include<iostream>
    #include<algorithm>
    #include<vector>
    using namespace std;
    
    vector<int> add(vector<int> a, vector<int> b) {
        vector<int> c;
        int t = 0;
        for(int i = 0; i < a.size() || i < b.size(); i++) {
            if(i < a.size()) t += a[i];
            if(i < b.size()) t += b[i];
            c.push_back(t % 10);
            t /= 10;
        }
        if(t) c.push_back(t);
        return c;
    }
    
    int main() {
        vector<int> a, b;
        string s1, s2;
        cin >> s1 >> s2;
        for(int i = s1.size() - 1; i >= 0; i--) {
            a.push_back(s1[i] - '0');
        }
        for(int i = s2.size() - 1; i >= 0; i--) {
            b.push_back(s2[i] - '0');
        }
        
        auto c = add(a, b);
        for(int i = c.size() - 1; i >= 0; i--) cout << c[i];
        return 0;
    }
  3. 高精度减法

    #include<iostream>
    #include<algorithm>
    #include<vector>
    using namespace std;
    
    vector<int> sub(vector<int> a, vector<int> b) {
        vector<int> c;
        int t = 0;
        for(int i = 0; i < a.size(); i++) {
            t = a[i] - t;
            if(i < b.size()) t -= b[i];
            c.push_back((t + 10) % 10);
            if(t < 0) t = 1;
            else t = 0;
        }
        while(c.size() > 1 && c.back() == 0) {
            c.pop_back();
        }
        return c;
    }
    
    int main() {
        string s1, s2;
        vector<int> a, b;
        cin >> s1 >> s2;
        if(s1.size() < s2.size() || (s1.size() == s2.size() && s1 < s2)) {
            cout << '-';
            swap(s1, s2);
        }
        for(int i = s1.size() - 1; i >= 0; i--) a.push_back(s1[i] - '0');
        for(int i = s2.size() - 1; i >= 0; i--) b.push_back(s2[i] - '0');
        auto c = sub(a, b);
        for(int i = c.size() - 1; i >= 0; i--) cout << c[i];
        return 0;
    }
  4. 高精度乘法

    #include<iostream>
    #include<vector>
    using namespace std;
    
    vector<int> mul(vector<int> a, int b) {
        vector<int> c;
        int t = 0;
        for(int i = 0; i < a.size(); i++) {
            t = t + a[i] * b;
            c.push_back(t % 10);
            t /= 10;
        }
        
        while(t) {
            c.push_back(t % 10);
            t /= 10;
        }
        
        while(c.size() > 1 && c.back() == 0){
            c.pop_back();
        }
        
        return c;
    }
    
    int main() {
        string s;
        int x;
        vector<int> a;
        cin >> s >> x;
        for(int i = s.size() - 1; i >= 0; i--) a.push_back(s[i] - '0');
        auto ans = mul(a, x);
        for(int i = ans.size() - 1; i >= 0; i--) cout << ans[i];
        return 0;
    }
  5. 高精度除法

    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    vector<int> div(vector<int> a, int b, int& r) {
        vector<int> c;
        for(int i = 0; i < a.size(); i++) {
            r = r * 10 + a[i];
            c.push_back(r / b);
            r %= b;
        }
        
        reverse(c.begin(), c.end());
        while(c.size() > 1 && c.back() == 0) c.pop_back();
        return c;
    }
    int main() {
        string s;
        int b;
        vector<int> a;
        cin >> s >> b;
        for(int i = 0; i < s.size(); i++) a.push_back(s[i] - '0');
        int r = 0;
        auto c = div(a, b, r);
        for(int i = c.size() - 1; i >= 0; i--) cout << c[i];
        cout << endl << r;
        return 0;
    }
  6. 一维前缀和

    #include<iostream>
    using namespace std;
    
    const int N = 1e5 + 10;
    int a[N];
    
    int main() {
        int n, m;
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n >> m;
        for(int i = 1; i <= n; i++){
            int x;
            cin >> x;
            a[i] = a[i - 1] + x;
        }
        while(m--) {
            int l, r;
            cin >> l >> r;
            cout << a[r] - a[l - 1] << endl;
        }
        return 0;
    }
  7. 二维前缀和

    #include<iostream>
    using namespace std;
    
    const int N = 1010;
    int a[N][N];
    
    int main() {
        int n, m, k;
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n >> m >> k;
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= m; j++) {
                int x;
                cin >> x;
                a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + x;
            }
        }
        while(k--) {
            int x1, y1, x2, y2;
            cin >> x1 >> y1 >> x2 >> y2;
            cout << a[x2][y2] - a[x1 - 1][y2] - a[x2][y1 - 1] + a[x1 - 1][y1 - 1] << endl;
        }
        return 0;
    }
  8. 一维拆分

    #include<iostream>
    using namespace std;
    
    const int N = 1e5 + 10;
    int a[N];
    
    void insert(int l, int r, int c) {
        a[l] += c;
        a[r + 1] -= c;
    }
    
    int main() {
        int n, m;
        cin >> n >> m;
        for(int i = 1; i <= n; i++) {
            int x;
            cin >> x;
            insert(i, i, x);
        }
        while(m--) {
            int l, r, c;
            cin >> l >> r >> c;
            insert(l, r, c);
        }
        for(int i = 1; i <= n; i++) {
            a[i] += a[i - 1];
            cout << a[i] << ' ';
        }
        return 0;
    }
  9. 二维拆分

    #include<iostream>
    using namespace std;
    
    const int N = 1010;
    int a[N][N];
    
    void insert(int x1, int y1, int x2, int y2, int c) {
        a[x1][y1] += c;
        a[x2 + 1][y1] -= c;
        a[x1][y2 + 1] -= c;
        a[x2 + 1][y2 + 1] += c;
    }
    
    int main() {
        int n, m, q;
        cin >> n >> m >> q;
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= m; j++) {
                int x;
                cin >> x;
                insert(i, j, i, j, x);
            }
        }
        
        while(q--) {
            int x1, y1, x2, y2, c;
            cin >> x1 >> y1 >> x2 >> y2 >> c;
            insert(x1, y1, x2, y2, c);
        }
        
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= m; j++) {
                a[i][j] += a[i - 1][j] + a[i][j -1] - a[i -1][j - 1];
                cout << a[i][j] << ' ';
            }
            cout << endl;
        }
        return 0;
    }
  10. 双指针(最长连续不重复子序列)

    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    const int N = 1e5 + 10;
    int a[N];
    int c[N];
    
    int main() {
        int n, ans = 0;
        cin >> n;
        for(int i = 0; i < n; i++) {
            cin >> a[i];
        }
        for(int i = 0, j = 0; i < n; i++) {
            c[a[i]]++;
            while(c[a[i]] > 1) {
                c[a[j]]--;
                j++;
            }
            ans = max(ans, i - j + 1);
        }
        
        cout << ans;
        return 0;
    }
  11. lowbit

    #include<iostream>
    using namespace std;
    
    int lowbit(int x) {
        return x & -x;
    }
    
    int main() {
        int n;
        cin >> n;
        while(n--) {
            int x;
            cin >> x;
            int ans = 0;
            while(x) {
                x -= lowbit(x);
                ans++;
            }
            cout << ans << ' ';
        }
        return 0;
    }
  12. 离散化

    #include<iostream>
    #include<algorithm>
    #include<vector>
    using namespace std;
    
    const int N = 3e5 + 10;
    int a[N];
    vector<int> point;
    vector<pair<int, int>> add, query;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n, m, x, c, l, r;
        cin >> n >> m;
        while(n--) {
            cin >> x >> c;
            point.push_back(x);
            add.push_back({x, c});
        }
        
        while(m--) {
            cin >> l >> r;
            point.push_back(l);
            point.push_back(r);
            query.push_back({l, r});
        }
        
        sort(point.begin(), point.end());
        point.erase(unique(point.begin(), point.end()), point.end());
        
        for(pair<int, int> item: add) {
            int x = lower_bound(point.begin(), point.end(), item.first) - point.begin();
            a[x + 1] += item.second;
        }
        
        for(int i = 1; i <= point.size(); i++) {
            a[i] += a[i - 1];
        }
        
        for(pair<int, int> item: query) {
            l = lower_bound(point.begin(), point.end(), item.first) - point.begin();
            r = lower_bound(point.begin(), point.end(), item.second) - point.begin();
            cout << a[r + 1] - a[l] << endl;
        }
        return 0;
    }
  13. 区间合并

    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    typedef pair<int, int> PII;
    vector<PII> v;
    
    int main() {
        int n, ans = 0;
        cin >> n;
        while(n--) {
            int l, r;
            cin >> l >> r;
            v.push_back({l, r});
        }
        
        sort(v.begin(), v.end());
        
        int start = v[0].first, end = v[0].second;
        for(PII item: v) {
            if(item.first <= end && item.second > end) {
                end = item.second;
            } else if(item.first > end) {
                ans++;
                start = item.first;
                end = item.second;
            }
        }
        ans++;
        cout << ans;
        return 0;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值