zoukankan      html  css  js  c++  java
  • FUNDAMENTAL PART1

    Part1

    +++

    1.快排quick_sort()

    分而治之

    #include <iostream>
    
    using namespace std;
    
    const int N = 1e6 + 10;
    
    int q[N], n;
    
    void quick_sort(int q[], int l, int r)
    {
        if(l >= r) return;
        
        int x = q[l + r >> 1], 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()
    {
        scanf("%d", &n);
        for(int i = 0; i < n; i ++ ) scanf("%d", q + i);
        
        quick_sort(q, 0, n - 1);
        
        for(int i = 0; i < n; i ++ ) printf("%d ", q[i]);
        cout << endl;
        
        return 0;
    }
    
    2.归并排序merge_sort()
    #include <iostream>
    
    using namespace std;
    
    const int N = 1e6 + 10;
    
    int q[N], temp[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]) temp[k ++ ] = q[i ++ ];
            else temp[k ++ ] = q[j ++ ];
        
        while(i <= mid) temp[k ++ ] = q[i ++ ];
        while(j <= r) temp[k ++ ] = q[j ++ ];
        
        for(i = l, j = 0; i <= r; i ++ , j ++ ) q[i] = temp[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]);
        cout << endl;
        
        return 0;
    }
    
    3.高精度加法
    (不压位)
    #include <iostream>
    #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(1);
        
        return C;
    }
    
    int main()
    {
        string a, b;
        vector<int> A, B;
        
        cin >> a >> b;
        
        for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');
        for (int i = b.size() - 1; i >= 0; i -- ) B.push_back(b[i] - '0');
        
        auto C = add(A, B);
        
        for(int i = C.size() - 1; i >= 0; i -- ) printf("%d", C[i]);
        
        return 0;
    }
    
    4.高精度减法
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    bool cmp(vector<int> &A, vector<int> &B)
    {
        if(A.size() != B.size()) return A.size() > B.size();
        
        for(int i = A.size() - 1; i >= 0; i -- )
            if(A[i] != B[i]) return A[i] > B[i];
        
        return true;
    }
    
    vector<int> sub(vector<int> &A, vector<int> &B)
    {
        vector<int> C;
        for(int i = 0, t = 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();//消除前置0
        
        return C;
    }
    
    int main()
    {
        string a, b;
        vector<int> A, B;
        
        cin >> a >> b;
        for(int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');
        for(int i = b.size() - 1; i >= 0; i -- ) B.push_back(b[i] - '0');
        
        if(cmp(A, B))
        {
            auto C = sub(A, B);
            
            for(int i = C.size() - 1; i >= 0; i -- ) printf("%d", C[i]);
        }
        else
        {
            auto C = sub(B, A);
            
            printf("-");
            for(int i = C.size() - 1; i >= 0; i -- ) printf("%d", C[i]);
        }
        
        return 0;
    }
    
    5.高精度乘法
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    vector<int> mul(vector<int> &A, int b)
    {
        vector<int> C;
        
        for(int i = 0, t = 0; i < A.size() || t; i ++ )
        {
            if(i < A.size()) t += A[i] * b;
            C.push_back(t % 10);
            t /= 10;
            
        }
        
        while(C.size() > 1 && C.back() == 0) C.pop_back();
        
        return C;
    }
    
    int main()
    {
        string a;
        int b;
        
        cin >> a >> b;
        
        vector<int> A;
        for(int i = a.size() - 1; i >= 0 ; i -- ) A.push_back(a[i] - '0');
        
        auto C = mul(A, b);
        
        for(int i = C.size() - 1; i >= 0; i -- ) printf("%d", C[i]);
        
        return 0;
    }
    
    6.高精度除法
    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    using namespace std;
    
    vector<int> div(vector<int> &A, int b, int &r)
    {
        vector<int> C;
        r = 0;
        for(int i = A.size() - 1; i >= 0; 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 a;
        int b;
        
        cin >> a >> b;
        
        vector<int> A;
        for(int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');
        
        int r;
        auto C = div(A, b, r);
        
        for(int i = C.size() - 1; i >= 0; i -- ) printf("%d", C[i]);
        cout << endl << r << endl;
        
        return 0;
    }
    
    7.前缀和
    one way
    #include <iostream>
    
    using namespace std;
    
    const int N = 1e5 + 10;
    
    int a[N], s[N];
    
    int main()
    {
        int n, m;
        scanf("%d%d", &n, &m);
        
        for (int i = 1; i <= n; i ++ )
        {
            scanf("%d", a + i);
            s[i] = s[i - 1] + a[i];
        }
        
        int l, r;
        while(m -- )
        {
            scanf("%d%d", &l, &r);
            printf("%d
    ", s[r] - s[l - 1]);
        }
        
        return 0;
    }
    
    two way
    #include <iostream>
    
    using namespace std;
    
    const int N = 1010;
    
    int a[N][N], s[N][N];
    int n, m, q;
    
    int main()
    {
        scanf("%d%d%d", &n, &m, &q);
        
        for (int i = 1; i <= n; i ++ )
            for (int j = 1; j <= m; j ++ )
            {
                scanf("%d", &a[i][j]);
                s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];
            }
        
        int x1, y1, x2, y2;
        while(q -- )
        {
            scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
            printf("%d
    ", s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1]);
        }
        
        return 0;
    }
    
    8.差分
    one way
    #include <iostream>
    
    using namespace std;
    
    const int N = 1e5 + 10;
    
    int a[N], b[N];
    int n, m;
    
    void insert(int l, int r, int c)
    {
        b[l] += c, b[r + 1] -= c;
    }
    
    int main()
    {
        scanf("%d%d", &n, &m);
        
        for (int i = 1; i <= n; i ++ )
        {
            scanf("%d", a + i);
            insert(i, i, a[i]);
        }
        
        int l, r, c;
        while(m -- )
        {
            scanf("%d%d%d", &l, &r, &c);
            insert(l, r, c);
        }
        
        for (int i = 1; i <= n; i ++ ) b[i] += b[i - 1];
    
        for (int i = 1; i <= n; i ++ ) printf("%d ", b[i]);
    
        return 0;
    }
    
    two way
    #include <iostream>
    
    using namespace std;
    
    const int N = 1010;
    
    int a[N][N], b[N][N];
    int n, m, q;
    
    void insert(int x1, int y1, int x2, int y2, int c)
    {
        b[x1][y1] += c;
        b[x2 + 1][y1] -= c;
        b[x1][y2 + 1] -= c;
        b[x2 + 1][y2 + 1] += c;
    }
    
    int main()
    {
        scanf("%d%d%d", &n, &m, &q);
        for (int i = 1; i <= n; i ++ )
            for (int j = 1; j <= m; j ++ )
            {
                scanf("%d", &a[i][j]);
                insert(i, j, i, j, a[i][j]);
            }
        
        int x1, x2, y1, y2, c;
        while(q -- )
        {
            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 ++ )
                b[i][j] += b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1];
        
        for (int i = 1; i <= n; i ++ )
        {
            for(int j = 1; j <= m; j ++ )
                printf("%d ", b[i][j]);
            
            puts("");
        }
        
        return 0;
    }
    

    +++

    +++

    1.第k个数(quick_sort)
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 1e5 + 10;
    
    int a[N], n, k;
    
    int quick_sort(int l, int r, int k)
    {
        if(l == r) return a[l];
        
        int x = a[l + r >> 1], i = l - 1, j = r + 1;
        while(i < j)
        {
            do i ++ ; while(a[i] < x);
            do j -- ; while(a[j] > x);
            
            if(i < j) swap(a[i], a[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()
    {
        cin >> n >> k;
        for (int i = 0; i < n; i ++ ) cin >> a[i];
        
        cout << quick_sort(0, n - 1, k) << endl;
        
        return 0;
    }
    
    2.逆序对的数量
    #include <iostream>
    
    using namespace std;
    
    typedef long long LL;
    
    const int N = 1e5 + 10;
    
    int q[N], temp[N], n;
    
    LL merge_sort(int l, int r)
    {
        if(l >= r) return 0;
        
        int mid = l + r >> 1;
        
        LL res = merge_sort(l, mid) + merge_sort(mid + 1, r);
        
        int k = 0, i = l, j = mid + 1;
        while(i <= mid && j <= r)
            if(q[i] <= q[j]) temp[k ++ ] = q[i ++ ];
            else
            {
                temp[k ++ ] = q[j ++ ];
                res += mid - i + 1;
            }
        
        while(i <= mid) temp[k ++ ] = q[i ++ ];
        while(j <= r) temp[k ++ ] = q[j ++ ];
        
        for (i = l, j = 0; i <= r; i ++ , j ++ ) q[i] = temp[j];
        
        return res;
    }
    
    int main()
    {
        scanf("%d", &n);
        for (int i = 0; i < n; i ++ ) scanf("%d", q + i);
        
        printf("%lld
    ", merge_sort(0, n - 1));
        
        return 0;
    }
    

    +++

    +++

    9.双指针(最长连续不重复子序列)

    先想暴力做法,然后根据单调关系优化复杂度

    #include <iostream>
    
    using namespace std;
    
    const int N = 1e5 + 10;
    
    int a[N], s[N], n;
    
    int main()
    {
        scanf("%d", &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(j <= i && s[a[i]] > 1)
            {
                s[a[j]] -- ;
                j ++ ;
            }
            
            res = max(res, i - j + 1);
        }
        
        cout << res << endl;
        
        return 0;
    }
    
    10.位运算(1的个数)
    #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 res = 0;
            while(x) x -= lowbit(x), res ++ ;
            
            cout << res << ' ';
        }
        
        return 0;
    }
    
    11.离散化(区间和)
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    typedef pair<int, int> PII;
    
    const int N = 3e5 + 10;
    
    int n, m;
    int a[N], s[N];
    
    vector<int> alls;
    vector<PII> add, query;
    
    int find(int x)
    {
        int l = 0, r = alls.size() - 1;
        while(l < r)
        {
            int mid = l + r >> 1;
            if(alls[mid] >= x) r = mid;
            else l = mid + 1;
        }
        
        return r + 1;
    }
    
    int main()
    {
        cin >> n >> m;
        
        int x, c;
        for (int i = 0; i < n; i ++ )
        {
            cin >> x >> c;
            
            add.push_back({x, c});
            alls.push_back(x);
        }
        
        int l, r;
        for (int i = 0; i < m; i ++ )
        {
            cin >> l >> r;
            
            query.push_back({l, r});
            alls.push_back(l);
            alls.push_back(r);
        }
        
        //去重
        sort(alls.begin(), alls.end());
        alls.erase(unique(alls.begin(), alls.end()), alls.end());
        
        for (auto item : add)
        {
            int x = find(item.first);
            a[x] += item.second;
        }
        
        for (int i = 1; i <= alls.size(); i ++ ) s[i] = s[i - 1] + a[i];
        
        for (auto item : query)
        {
            int l = find(item.first), r = find(item.second);
            
            cout << s[r] - s[l - 1] << endl;
        }
        
        return 0;
    }
    
    
    12.区间和并
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    typedef pair<int, int> PII;
    
    vector<PII> segs;
    int n;
    
    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(ed != -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()
    {
        scanf("%d", &n);
        int l, r;
        while(n -- )
        {
            scanf("%d%d", &l, &r);
            segs.push_back({l, r});
        }
        
        merge(segs);
        
        cout << segs.size() << endl;
        
        return 0;
    }
    
  • 相关阅读:
    【struts1】--Servlet讲解MVC框架基本原理
    bigDecimal使用方法详解(转载)
    【web】--Ajax data选择性赋值
    【JSTL】--格式化日期--drp217
    2021-01-01:https加解密机制,你了解多少?
    2020-12-31:tcp三次握手,最后一次失败,网络会怎么样?
    2020-12-30:生产环境 CPU 占用过高,你如何解决?
    2020-12-29:mysql中,innodb表里,某一条数据删除了之后,这条数据会被真实的擦掉吗,还是删除了关系?
    2020-12-28:java中,生产环境服务器变慢,如何诊断处理?
    2020-12-27:网络调试工具都用了什么?
  • 原文地址:https://www.cnblogs.com/scl0725/p/13130675.html
Copyright © 2011-2022 走看看