警告
本文最后更新于 2022-06-20,文中内容可能已过时。
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
 | #include <bits/stdc++.h>
using namespace std;
using ll = long long;
void solve() {
    int n;
    cin >> n;
    cout << n << endl;
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t;
    cin >> t;
    while (t--) solve();
    return 0;
}
 | 
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
 | #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;
typedef pair<int, int> pi;
typedef pair<ll,ll> pl;
typedef pair<ld,ld> pd;
typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;
template<class T> using pq = priority_queue<T>;
template<class T> using pqg = priority_queue<T, vector<T>, greater<T>>;
#define FOR(i, a, b) for (int i=a; i<(b); i++)
#define F0R(i, a) for (int i=0; i<(a); i++)
#define FORd(i,a,b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--)
#define trav(a,x) for (auto& a : x)
#define uid(a, b) uniform_int_distribution<int>(a, b)(rng)
#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()
#define ins insert
template<class T> bool ckmin(T& a, const T& b) { return b < a ? a = b, 1 : 0; }
template<class T> bool ckmax(T& a, const T& b) { return a < b ? a = b, 1 : 0; }
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
void __print(int x) {cerr << x;}
void __print(long x) {cerr << x;}
void __print(long long x) {cerr << x;}
void __print(unsigned x) {cerr << x;}
void __print(unsigned long x) {cerr << x;}
void __print(unsigned long long x) {cerr << x;}
void __print(float x) {cerr << x;}
void __print(double x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << '\'' << x << '\'';}
void __print(const char *x) {cerr << '\"' << x << '\"';}
void __print(const string &x) {cerr << '\"' << x << '\"';}
void __print(bool x) {cerr << (x ? "true" : "false");}
template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ", "; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? ", " : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
 | 
排序模板
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 | public class SortTemplate {
    public static void sort(Comparable[] array) {}
    private static boolean less(Comparable a, Comparable b) { return a.compareTo(b) < 0; }
    private static void exchange(Comparable[] array, int i, int j) {
        Comparable temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
    private static void show(Comparable[] array) {
        for (Comparable elem : array) {
            System.out.print(elem + " ");
        }
        System.out.println();
    }
    private static boolean isSorted(Comparable[] array) {
        for (int i = 1; i < array.length; i++) {
            if (less(array[i], array[i - 1])) {
                return false;
            }
        }
        return true;
    }
}
 | 
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
 | public class SelectionSort {
    public static void sort(Comparable[] array) {
        int len = array.length;
        for (int i = 0; i < len; i++) {
            int minIdx = i;
            for (int j = i + 1; j < len; j++) {
                if (less(array[j], array[minIdx])) {
                    minIdx = j;
                }
            }
            exchange(array, i, minIdx);
        }
    }
    private static boolean less(Comparable a, Comparable b) { return a.compareTo(b) < 0; }
    private static void exchange(Comparable[] array, int i, int j) {
        Comparable temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}
 | 
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
 | public class InsertionSort {
    public static void sort(Comparable[] array) {
        int len = array.length;
        for (int i = 1; i < len; i++) {
            for (int j = i; j > 0 && less(array[j], array[j - 1]); j--) {
                exchange(array, j, j - 1);
            }
        }
    }
    private static boolean less(Comparable a, Comparable b) { return a.compareTo(b) < 0; }
    private static void exchange(Comparable[] array, int i, int j) {
        Comparable temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}
 | 
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 | public class ShellSort {
    public static void sort(Comparable[] array) {
        int len = array.length;
        int step = 1;
        while (step < len / 3) {
            // 1, 4, 13, 40, 121, 364, 1093, ...
            step = step * 3 + 1;
        }
        while (step >= 1) {
            for (int i = step; i < len; i++) {
                for (int j = i; j >= step && less(array[j], array[j - step]); j -= step) {
                    exchange(array, j, j - step);
                }
            }
            step /= 3;
        }
    }
    private static boolean less(Comparable a, Comparable b) {
        return a.compareTo(b) < 0;
    }
    private static void exchange(Comparable[] array, int i, int j) {
        Comparable temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}
 | 
自顶向下
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 | public class MergeSort {
    private static Comparable[] copy;
    public static void sort(Comparable[] array) {
        int len = array.length;
        copy = new Comparable[len];
        sort(array, 0, len - 1);
    }
    private static void sort(Comparable[] array, int low, int high) {
        // [low, high]
        if (low >= high) return;
        int mid = low + (high - low) / 2;
        sort(array, low, mid);
        sort(array, mid + 1, high);
        merge(array, low, mid, high);
    }
    private static void merge(Comparable[] array, int low, int mid, int high) {
        // [low, high]
        int i = low;
        int j = mid + 1;
        if (high + 1 - low >= 0) System.arraycopy(array, low, copy, low, high + 1 - low);
        for (int k = low; k <= high; k++) {
            if (i > mid) {
                array[k] = copy[j++];
            } else if (j > high) {
                array[k] = copy[i++];
            } else if (less(copy[j], copy[i])) {
                array[k] = copy[j++];
            } else {
                array[k] = copy[i++];
            }
        }
    }
    private static boolean less(Comparable a, Comparable b) { return a.compareTo(b) < 0; }
}
 | 
自底向上
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 | public class MergeSort {
    private static Comparable[] copy;
    public static void sort(Comparable[] array) {
        int len = array.length;
        copy = new Comparable[len];
        for (int step = 1; step < len; step *= 2) {
            for (int low = 0; low < len - step; low += 2 * step) {
                merge(array, low, low + step - 1, Math.min(low + 2 * step - 1, len - 1));
            }
        }
    }
    private static void merge(Comparable[] array, int low, int mid, int high) {
        // [low, high]
        int i = low;
        int j = mid + 1;
        if (high + 1 - low >= 0) System.arraycopy(array, low, copy, low, high + 1 - low);
        for (int k = low; k <= high; k++) {
            if (i > mid) {
                array[k] = copy[j++];
            } else if (j > high) {
                array[k] = copy[i++];
            } else if (less(copy[j], copy[i])) {
                array[k] = copy[j++];
            } else {
                array[k] = copy[i++];
            }
        }
    }
    private static boolean less(Comparable a, Comparable b) { return a.compareTo(b) < 0; }
}
 | 
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 | public class QuickSort {
    public static void sort(Comparable[] array) {
        sort(array, 0, array.length - 1);
    }
    public static void sort(Comparable[] array, int low, int high) {
        // [low, high]
        if (low >= high) return;
        int i = partition(array, low, high);
        sort(array, low, i - 1);
        sort(array, i + 1, high);
    }
    private static int partition(Comparable[] array, int low, int high) {
        // [low, high]
        int i = low;
        int j = high + 1;
        Comparable copy = array[low];
        while (true) {
            while (less(array[++i], copy)) {
                if (i == high) break;
            }
            while (less(copy, array[--j])) {
                if (j == low) break;
            }
            if (i >= j) break;
            exchange(array, i, j);
        }
        exchange(array, low, j);
        return j;
    }
    private static boolean less(Comparable a, Comparable b) { return a.compareTo(b) < 0; }
    private static void exchange(Comparable[] array, int i, int j) {
        Comparable temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}
 | 
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
 | int binarySearch(vector<int> arr, const int target) {
    // 升序数组
    // [low, high]
    int low = 0, high = arr.size() - 1, mid;
    while (low <= high) {
        mid = low + (high - low) / 2;
        if (target == arr[mid]) {
            return mid;
        } else if (target > arr[mid]) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }
    return -1;
}
 | 
头文件
| 1
 | #include<bits/stdc++.h>
 | 
判断奇偶
| 1
2
 | if (x & 1)  // 奇数,等价于 x % 2
else        // 偶数
 | 
快速乘除2
| 1
2
 | x <<= 1;  // 乘2,等价于 x *= 2;
x >>= 1;  // 除2,等价于 x /= 2;
 | 
快速交换
| 1
2
3
 | a ^= b;  // a1 = a ^ b
b ^= a;  // b1 = b ^ a1 = b ^ a ^ b = a
a ^= b;  // a2 = a1 ^ b1 = a ^ b ^ a = b
 | 
遍历字符串
| 1
 | for (int i = 0; s[i]; i++)
 | 
使用 emplace_back() 代替 push_back()
内置求最大公约数函数:__gcd(x, y);
使用 inline 函数
全局数组最大 $ 10^7 $,函数内数组最大 $ 10^6 $
得到最高有效位数字
| 1
2
3
 | double k = log(n, 10);
k -= floor(k);
x = pow(10, k);
 | 
得到数字的有效位数
| 1
 | n = floor(log(n, 10)) + 1;
 | 
判断是否是 2 的幂(Brian Kernighan’s Algorithm)
| 1
2
 | // log(n)
n && (!(n & (n - 1)))
 | 
C++11 内置 STL 函数
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
 | // 是否全是正数?
all_of(first, first + n, [](int x) { return x > 0; });
// 是否存在正数
any_of(first, first + n, [](int x) { return x > 0; });
// 是否全不是正数?
none_of(first, first + n, [](int x) { return x > 0; });
// 复制
int source[5] = {0, 12, 34, 50, 80};
int target[5];
copy_n(source, 5, target);
// 迭代
int a[5] = {0};
char c[3] = {0};
iota(a, a + 5, 10);   // {10, 11, 12, 13, 14}
iota(c, c + 3, 'a');  // {'a', 'b', 'c'}
 | 
二进制表示
| 1
2
 | auto number = 0b011;
cout << number;  // 3
 | 
Using Range based for loop
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
 | /*** 函数 ***/
#include<algorithm>
#include<functional> // hash
#include<climits>    // 常量
#include<cmath>
#include<cstdio>
#include<cstdlib>    // random
#include<ctime>
#include<iostream>
#include<sstream>
#include<iomanip>    // 右对齐 std::right 设置宽度 std::setw(width)
/*** 数据结构 ***/
#include<deque>
#include<list>
#include<queue>      // 包括 priority_queue
#include<stack>
#include<string>
#include<vector>
 | 
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
 | #include<iostream> // cin cout
#include<cstdio>   // scanf printf
// cin does not concern with ’\n’ at end of each line
// however scanf or getline does concern with ’\n’ at end of each line
// ’\n’ will be ignored when you use cin to read char.
// 读取数值数据后在读取字符串
cin >> n;
getline(cin, str) // wasted getline
getline(cin, str) // real input string
 |