模版大全!!模板大全!!

模版大全!!模板大全!!

今天无事,整理整理自己写过的模版

以后会经常更新模版哦!

冒泡排序(从小到大)

P1177 【模板】排序

#include <bits/stdc++.h>
using namespace std;
int n, a[100005];
int main(){
    cin >> n;
    for(int i = 0; i < n; i++) cin >> a[i];
    for(int i = 0; i < n; i++){
        for(int j = 0; j < i; j++){
            if(a[i] < a[j]) swap(a[j], a[i]);
        }
    }
    for(int i = 0; i < n; i++) cout << a[i] << " ";
    return 0;
}

快速幂

P1226 【模板】快速幂

#include <bits/stdc++.h>
using namespace std;
long long a, b, p, ans = 1, b1, a1;
int main(){
    cin >> a >> b >> p;
    b1 = b, a1 = a;
    while(b){
        if(b & 1) ans = ans * a % p;
        a = a * a % p;
        b >>= 1;
    }
    printf("%d^%d mod %d=%d", a1, b1, p, ans);
    return 0;
}

Nim 游戏

P2197 【模板】Nim 游戏

#include <bits/stdc++.h>
using namespace std;
int n, t, a, ans;
int main(){
    cin >> t;
    while(t--){
        cin >> n >> a;
        ans = a;
        for(int i = 1; i < n; i++){
            cin >> a;
            ans ^= a;
        }
        if(ans) cout << "Yes\n";
        else cout << "No\n";
    }
    return 0;
}

单调栈

P5788 【模板】单调栈

#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e6 + 10;
int n, a[maxn], f[maxn];
stack<int> stk;
int main(){
    cin >> n;
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for(int i = 1; i <= n; i++){
        while(!stk.empty() && a[stk.top()] < a[i]) {
            f[stk.top()] = i;
            stk.pop();
        }
        stk.push(i);
    }
    while(!stk.empty()) {
        f[stk.top()] = 0;
        stk.pop();
    }
    for(int i = 1; i <= n; i++) printf("%d ", f[i]);
    return 0;
}

KMP

P3375 【模板】KMP

#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
int m, n, kmp[N];
char s[N], p[N];
int main(){
    cin >> s + 1 >> p + 1;
    m = strlen(s + 1), n = strlen(p + 1);
    for(int i = 2, j = 0; i <= n; i++){
        while(j && p[i] != p[j + 1]) j = kmp[j];
        if(p[i] == p[j + 1]) j++;
        kmp[i] = j;
    }
    for(int i = 1, j = 0; i <= m; i++){
        while(j && s[i] != p[j + 1]) j = kmp[j];
        if(s[i] == p[j + 1]) j++;
        if(j == n) cout << i - n + 1 << "\n";
    }
    for(int i = 1; i <= n; i++) cout << kmp[i] << " ";
    return 0;
}

裴蜀定理

P4549 【模板】裴蜀定理

#include <bits/stdc++.h>
using namespace std;
int n, a, ans;
int main(){
    cin >> n;
    for(int i = 0; i < n; i++){
        int a;
        cin >> a;
        a = abs(a);
        ans = __gcd(ans, a);
    }
    cout << ans;
   return 0;
}

最小表示法

P1368 【模板】最小表示法

#include <bits/stdc++.h>
using namespace std;
int n, a[610005];
int get_min(){
    for(int i = 1; i <= n; i++) a[n + i] = a[i];
    int i = 1, j = 2, k = 0;
    while(i <= n && j <= n){
        for(k = 0; k < n && a[i + k] == a[j + k]; k++) ;
        a[i + k] > a[j + k] ? i = i + k + 1 : j = j + k + 1;
        if(i == j) j++;
    }
    return min(i, j);
}
int main(){
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    int k = get_min();
    for(int i = 0; i < n; i++) cout << a[k + i] << " ";
    return 0;
}

线性筛素数

P3383 【模板】线性筛素数

#include <bits/stdc++.h>
using namespace std;
bool isPrime[100000010];
int Prime[6000010], cnt, n, q;
void GetPrime(int n){
	memset(isPrime, 1, sizeof(isPrime));
	isPrime[1] = 0;
	for(int i = 2; i <= n; i++){
		if(isPrime[i]) Prime[++cnt] = i; 
		for(int j = 1; j <= cnt && i * Prime[j] <= n; j++){
			isPrime[i * Prime[j]] = 0;
			if(i % Prime[j] == 0) break; 
		}
	}
}
int main(){
    ios::sync_with_stdio(0);
	cin >> n >> q;
	GetPrime(n);
	while(q--){
		int k;
		cin >> k;
		cout << Prime[k] << endl;
	}
	return 0;
}

dijstra 最短路

P4779 【模板】单源最短路径(标准版)

#include <bits/stdc++.h>
using namespace std;
struct E {
    int to, weight;
};
struct Compare { 
    bool operator()(const pair<int, int> &a, const pair<int, int> &b){
        return a.first > b.first;
    }
};
void dijkstra(int n, int m, int s, vector<vector<E>> &graph){
    vector<int> dis(n + 1, 0x3f3f3f3f);
    dis[s] = 0;
    priority_queue<pair<int, int>, vector<pair<int, int>>, Compare> pq;
    pq.push({0, s});
    while(!pq.empty()){
        auto [d, u] = pq.top();
        pq.pop();
        if(d > dis[u]) continue;
        for(auto &e : graph[u]){
            if(dis[e.to] > dis[u] + e.weight){
                dis[e.to] = dis[u] + e.weight;
                pq.push({dis[e.to], e.to});
            }
        }
    }
    for(int i = 1; i <= n; i++) printf("%d ", dis[i]);
}
int n, m, s;
int main(){
    scanf("%d%d%d", &n, &m, &s);
    vector<vector<E>> graph(n + 1);
    for(int i = 0; i < m; i++){
        int u, v, w;
        scanf("%d%d%d", &u, &v, &w);
        graph[u].emplace_back(E{v, w});
    }
    dijkstra(n, m, s, graph);
    return 0;
}

单调队列

P1886 滑动窗口 /【模板】单调队列

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
int a[maxn];
int a1[maxn], a2[maxn];
deque<int> q1;
deque<int> q2;
int main(){
    int n, k;
    scanf("%d%d", &n, &k);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for(int i = 1; i <= n; i++){
        while(!q1.empty() && a[q1.back()] > a[i]) q1.pop_back();
        while(!q2.empty() && a[q2.back()] < a[i]) q2.pop_back();
        q1.push_back(i);
        q2.push_back(i);
        if(i >= k){
            while(q1.front() < i - k + 1)q1.pop_front();
            a1[i] = a[q1.front()];
            while(q2.front() < i - k + 1)q2.pop_front();
            a2[i] = a[q2.front()];
        }
        
    }
    for(int i = k; i <= n; i++) printf("%d ", a1[i]);
    printf("\n");
    for(int i = k; i <= n; i++) printf("%d ", a2[i]);
    return 0;
}

模意义下的乘法逆元

P3811 【模板】模意义下的乘法逆元

#include <bits/stdc++.h>
using namespace std;
long long n, p, ans[3000005];
int main(){
    ans[1] = 1;
    cin >> n >> p;
    cout << "1\n";
    for(long long i = 2; i <= n; i++){
        ans[i] = (long long)(p - p / i) * ans[p % i] % p;
        cout << ans[i] << "\n";
    }
}

Floyd 最短路

B3647 【模板】Floyd

#include <bits/stdc++.h>
using namespace std;
int n, m, u, v, w, a[105][105];
void init(){
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++) a[i][j] = 0x3f3f3f3f;
        a[i][i] = 0;
    }
}
void add(int u, int v, int w){
    if(a[u][v] != 0x3f3f3f3f) a[u][v] = min(w, a[u][v]);
    else a[u][v] = w;
}
void floyed(){
    for(int k = 1; k <= n; k++){
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= n; j++){
                if(a[i][j] > a[i][k] + a[k][j]) add(i, j, a[i][k] + a[k][j]), add(j, i, a[i][k] + a[k][j]);
            }
        }
    }
}
int main(){
    cin >> n >> m;
    init();
    for(int i = 0; i < m; i++){
        cin >> u >> v >> w;
        add(u, v, w), add(v, u, w);
    }
    floyed();
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++) cout << a[i][j] << " ";
        cout << "\n";
    }
    return 0;
}

快速读入

P10815 【模板】快速读入

#include <bits/stdc++.h>
using namespace std;
int n, a, ans;
int read(){
    int x = 0, f = 1;
    char c = getchar_unlocked();
    while(c < '0' || c > '9'){
        if(c == '-') f = -1;
        c = getchar_unlocked();
    }
    while(c >= '0' && c <= '9'){
        x = (x << 1) + (x << 3) + (c - '0');
        c = getchar_unlocked ();
    }
    return x * f;
}
int main () {
    ios::sync_with_stdio (false);
    n = read ();
    while(n --){
        a = read();
        ans += a;
    }
    cout << ans;
}

传递闭包

B3611 【模板】传递闭包

#include <bits/stdc++.h>
using namespace std;
int n, a[105][105];
void add(int u, int v, int w){
    a[u][v] = w;
}
void floyed(int n){
    for(int k = 1; k <= n; k++){
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= n; j++){
                if(a[i][k] && a[k][j]) add(i, j, 1);
            }
        }
    }
}
int main(){
    cin >> n;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++) cin >> a[i][j];
    }
    floyed(n);
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++) cout << a[i][j] << " ";
        cout << "\n";
    }
    return 0;
}

负环

P3385 【模板】负环

#include <bits/stdc++.h>
using namespace std;
int m, t, x, y, v, cnt;
struct node {
	int x , y , v;
}e[2000005];
void add1(int x, int y, int v){
	e[++cnt] = {x , y , v};
}
void add2(int x, int y , int v){
	if(v < 0) add1(x , y , v);
	if(v >= 0) add1(x , y , v) , add1(y , x , v);
}
int n;
bool floyed(){
	int d[2000005] = {0, 0};
	for(int i = 2; i <= n; i++) d[i] = 0x7fffffff;
	for(int i = 1 ; i <= n - 1; i++){
		for(int j = 1; j <= cnt; j++){
			if(d[e[j].x] != 0x7fffffff && d[e[j].x] + e[j].v < d[e[j].y]) d[e[j].y] = d[e[j].x] + e[j].v;
		}
	}
	for(int i = 1; i <= cnt; i++){
		if(d[e[i].x] == 0x7fffffff || d[e[i].y] == 0x7fffffff) continue;
		if(d[e[i].x] + e[i].v < d[e[i].y]) return true;
	}
	return false;
}
int main(){
	cin >> t;
	while(t--){
		memset(e, 0, sizeof(e));
		cnt = 0;
		cin >> n >> m;
		for(int i = 1; i <= m; i++){
			cin >> x >> y >> v;
			add2(x, y, v);
		}
		if(floyed()) cout << "YES\n";
		else cout << "NO\n";		
	}
	return 0;
}

并查集

P3367 【模板】并查集

#include <bits/stdc++.h>
using namespace std;
int n, m, p1, p2, p3, f[10010];
void init(int n){
    for(int i = 1; i <= n; i++) f[i] = i;
}
int find(int x){
    if(f[x] == x) return x;
    return f[x] = find(f[x]);
}
int main(){
    cin >> n >> m;
    init(n);
    for(int i = 1; i <= m; i++){
        cin >> p1 >> p2 >> p3;
        if(p1 == 1) f[find(p2)] = find(p3);
        else {
            if(find(p2) == find(p3)) cout << "Y\n";
            else cout << "N\n";
        }
    }
    return 0;
}

普通平衡树

P3369 【模板】普通平衡树

#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n, q[N], a[N], p[N], tot, c[N];
int h(int x){ 
    return lower_bound(q + 1, q + 1 + tot, x) - q; 
}
int lowbit(int x){ 
    return x & -x;
}
void add(int x, int p){
    while(x <= tot) c[x] += p, x += lowbit(x);
}
int sum(int x){
    int res = 0;
    while(x) res += c[x], x -= lowbit(x);
    return res;
}
int query(int x){
    int t = 0;
    for(int i = 19; i >= 0; i--){
        t += 1 << i;
        if(t > tot || c[t] >= x) t -= 1 << i;
        else x -= c[t];
    }
    return q[t + 1];
}
int main(){
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> p[i] >> a[i];
        if(p[i] != 4) q[++tot] = a[i];
    }
    sort(q + 1, q + 1 + tot);
    tot = unique(q + 1, q + 1 + tot) - (1 + q);
    for(int i = 1; i <= n; i++){
        if(p[i] == 1) add(h(a[i]), 1);
        if(p[i] == 2) add(h(a[i]), -1);
        if(p[i] == 3) cout << sum(h(a[i]) - 1) + 1 << "\n";
        if(p[i] == 4) cout << query(a[i]) << "\n";
        if(p[i] == 5) cout << query(sum(h(a[i]) - 1)) << "\n";
        if(p[i] == 6) cout << query(sum(h(a[i])) + 1) << "\n";
    }
    return 0;
}

树状数组

P3374 【模板】树状数组 1

#include <bits/stdc++.h>
using namespace std;
const int N = 2000005;
int n, m, f[N];
int lowbit(int k){
    return k & -k;
}
void add(int x, int k){
    while(x <= n) f[x] += k, x += lowbit(x);
}
int sum(int x){
    int ans = 0;
    while(x != 0) ans += f[x], x -= lowbit(x);
    return ans;
}
int main(){
    cin >> n >> m;
    for(int i = 1, x; i <= n; i++){
        cin >> x;
        add(i, x);
    }
    for (int i = 1, a, b, c; i <= m; i++){
        cin >> a >> b >> c;
        if(a == 1) add(b, c);
        if(a == 2) cout << sum(c) - sum(b - 1) << "\n";
    }
}

最长公共子序列

P1439 【模板】最长公共子序列

#include <bits/stdc++.h>
using namespace std;
int n, s, a[100010], b[100010], id[100010], f[100010], h[100010];
int main(){
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
        id[a[i]] = i;
    }
    for(int i = 1; i <= n; i++) cin >> b[i];
    for(int i = 1; i <= n; i++){
        if(id[b[i]] > h[s]){
            h[++s] = id[b[i]], f[i] = s;
            continue;
        }
        int k = lower_bound(h + 1, h + s + 1, id[b[i]]) - h;
        h[k] = id[b[i]], f[i] = k;
    }
    cout << s;
    return 0;
}

扫描线 & 矩形面积并

P5490 【模板】扫描线 & 矩形面积并

#include <bits/stdc++.h>
#define N 1000010
#define int long long
#define mid (l + r >> 1)
using namespace std;
int ans, n, val[N << 1], rk[N << 1], l;
struct edge {
    int x, y1, y2, k;
}e[N << 1];
struct node {
    int cnt, len;
}tr[N << 3];
inline void pushup(int l, int r, int p){
    if(tr[p].cnt) tr[p].len = val[r + 1] - val[l];
    else tr[p].len = tr[p << 1].len + tr[p << 1 | 1].len;
}
inline void ins(int wl, int wr, int l, int r, int p, int k){
    if(wl <= l && r <= wr) return tr[p].cnt += k, pushup(l, r, p), void();
    if(wl <= mid) ins(wl, wr, l, mid, p << 1, k);
    if(wr > mid) ins(wl, wr, mid + 1, r, p << 1 | 1, k);
    pushup(l, r, p);
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> n;
    for(int i = 1, xa, xb, ya, yb; i <= n; i++){
        cin >> xa >> ya >> xb >> yb;
        e[(i << 1) - 1] = {xa, ya, yb, 1};
        e[i << 1] = {xb, ya, yb, -1};
        rk[++l] = ya, rk[++l] = yb;
    }
    n <<= 1;
    sort(rk + 1, rk + 1 + n);
    l = unique(rk + 1, rk + n + 1) - rk - 1;
    for(int i = 1; i <= n; i++){
        int ya = lower_bound(rk + 1, rk + 1 + n, e[i].y1) - rk;
        int yb = lower_bound(rk + 1, rk + 1 + n, e[i].y2) - rk;
        val[ya] = e[i].y1, val[yb] = e[i].y2;
        e[i].y1 = ya, e[i].y2 = yb;        
    }
    sort(e + 1, e + 1 + n, [](edge a, edge b){return (a.x != b.x) ? a.x < b.x : a.k > b.k;});
    for(int i = 1; i < n; i++){
        ins(e[i].y1, e[i].y2 - 1, 1, n, 1, e[i].k);
        ans += tr[1].len * (e[i + 1].x - e[i].x);
    }
    cout << ans;
    return 0;
}

中国剩余定理

P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪

#include <bits/stdc++.h>
using namespace std;
long long n, c, i, ans, a[15], b[15];
long long lcm(long long a, long long b){
	return a * b / __gcd(a, b);
}
int main(){
	cin >> n;
	for(i = 1; i <= n; i++) cin >> a[i] >> b[i];
	c = a[1], ans = b[1];
	for(i = 2; i <= n; i++){
		for(; ans % a[i] != b[i];) ans += c;
		c = lcm(c, a[i]);
	}
	cout << ans;
	return 0;
}
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N = 1e5 + 5, INF = 0x3f3f3f3f;
struct node {
    bool f;
    double d;
    int p;
}dis[N];
int n, m, s, u, v, w;
vector<pair<int, int>> g[N];
priority_queue<pair<int, double>, vector<pair<int, double>>, greater<pair<int, double>>> pq;
inline void init(){
    for(int i = 1; i <= n; i++) dis[i].p = -1, dis[i].d = INF;
}
inline void add(int u, int v, int w){
    g[u].push_back({v, w});
}
inline void dijkstra(){
    dis[s].d = 0;
    pq.push({0, s});
    while(!pq.empty()){
        int u = pq.top().y;
        pq.pop();
        if(dis[u].f) continue;
        dis[u].f = true;
        for(auto e : g[u]){
            int v = e.x, w = e.y;
            if(!dis[v].f && dis[v].d > dis[u].d + w) dis[v].d = dis[u].d + w, dis[v].p = u, pq.push({dis[v].d, v});
        }
    }
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> n >> m >> s;
    init();
    for(int i = 1; i <= m; i++){
        cin >> u >> v >> w;
        add(u, v, w);
    }
    dijkstra();
    for(int i = 1; i <= n; i++) cout << dis[i].d << " ";
    return 0;
}
posted @ 2024-08-14 13:09  wayneoi  阅读(62)  评论(0)    收藏  举报