各种模板

【模板】栈

点击查看代码
#include <stack>
#include <string>
#include <iostream>
using namespace std;
int main() {
	cin.tie(0);
	int t, n;
	for (cin >> t; t; --t) {
		stack<unsigned long long int> s;
		for (cin >> n; n; --n) {
			string t;
			cin >> t;
			if (t == "push") {
				unsigned long long x;
				cin >> x;
				s.push(x);
			} else if (t == "pop") {
				if (s.empty()) {
					cout << "Empty\n";
				} else {
					s.pop();
				}
			} else if (t == "query") {
				if (s.empty()) {
					cout << "Anguei!\n";
				} else {
					cout << s.top() << '\n';
				}
			} else {
				cout << s.size() << '\n';
			}
		}
	}
	return 0;
}

题目:link

【模板】队列

点击查看代码
#include<iostream>
using namespace std;
int n, x, m;
int queue[10005], head = 1, tail = 0;
int main() {
	cin >> n;
	while (n--) {
		cin >> x;
		switch (x) {
			case 1:
				cin >> m;
				queue[++tail] = m;
				break;
			case 2:
				if (head > tail) {
					cout << "ERR_CANNOT_POP" << '\n';
				} else {
					head++;
				}
				break;
			case 3:
				if (head > tail) {
					cout << "ERR_CANNOT_QUERY" << '\n';
				} else {
					cout << queue[head] << '\n';
				}
				break;
			case 4:
				cout << tail - head + 1 << '\n';
				break;
		}
	}
	return 0;
}

题目:link

【模板】Floyd 算法

点击查看代码
#include <bits/stdc++.h>
using namespace std;

int n, m;
int u, v, w;
int l[105][105];

int main() {
    memset(l, 0x3f, sizeof(l));
    for (int i = 1; i <= 100; i++) {
        l[i][i] = 0;
    }
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        cin >> u >> v >> w;
        l[u][v] = w;
        l[v][u] = w;
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (i != j) {
                for (int k = 1; k <= n; k++) {
                    if (l[j][k] > l[i][j] + l[i][k]) {
                        l[j][k] = l[i][j] + l[i][k];
                    }
                }
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            cout << l[i][j] << " ";
        }
        cout << '\n';
    }
    return 0;
}

题目:link

【模板】传递闭包

点击查看代码
#include <bits/stdc++.h>
using namespace std;

int n, m;
int u, v, w;
int l[105][105];

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> l[i][j];
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (i != j) {
                for (int k = 1; k <= n; k++) {
                    l[j][k] |= (l[j][i] & l[i][k]);
                }
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            cout << l[i][j] << " ";
        }
        cout << '\n';
    }
    return 0;
}

题目:link

【模板】快速幂 || 取余运算

点击查看代码
#include <bits/stdc++.h>
using namespace std;

long long pow_(long long a, int b, int p) {
    long long s = 1;
    while (b) {
        if (b & 1) {
            s *= a % p, s %= p;
        }
        a = a % p * a % p;
        a %= p;
        b /= 2;
        s %= p;
    }
    return s % p;
}

int main() {
    int a, b, p;
    cin >> a >> b >> p;
    printf("%lld^%lld mod %lld=%lld", a, b, p, pow_(a, b, p));
    return 0;
}

题目:link

【模板】并查集

点击查看代码
#include <bits/stdc++.h>
using namespace std;
int size[10005];
int fa[10005];
int FF(int x) {
  return x == fa[x] ? x : fa[x] = FF(fa[x]);
}
void add(int u, int v) {
  u = FF(u), v = FF(v);
  if (u == v) return;
  if (size[u] < size[v]) swap(u, v);
  fa[v] = u;
  size[u] += size[v];
}
int main() {
  for (int i = 1; i <= 10000; i++) fa[i] = i;
  fill(size + 1, size + 10001, 0);
  int n, m;
  int z, x, y;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= m; i++) {
    scanf("%d %d %d", &z, &x, &y);
    if (z == 1) {
      add(x, y);
    } else {
      if (FF(x) == FF(y))
        cout << 'Y' << endl;
      else
        cout << 'N' << endl;
    }
  }
  return 0;
}

题目:link

【模板】线性筛素数

点击查看代码
#include <bits/stdc++.h>
using namespace std;

// Int:
int n, q;
int a[100000005];
int t = 1;
bool b[100000005];

// Func:

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  // Code:
  cin >> n >> q;
  for (int i = 2; i <= n; i++) {
    if (!b[i]) {
      a[t] = i;
      t++;
    }
    for (int j = 1; j <= t && a[j] * i <= n; j++) {
      b[a[j] * i] = 1;
      if (i % a[j] == 0) {
        break;
      }
    }
  }
  for (int i = 1; i <= q; i++) {
    int ttt;
    cin >> ttt;
    cout << a[ttt] << '\n';
  }
  return 0;
}

题目:link

【模板】最小生成树

Kruskal:

点击查看代码
#include <algorithm>
#include <iostream>
using namespace std;

struct node {
  int u, v, w;
  bool operator<(const node &b) {
    return this->w < b.w;
  }
};
int n, m;
node l[200005];
int fa[200005];
int sum;
int ans;

int Find(int x) {
  return fa[x] = ((fa[x] == x) ? x : Find(fa[x]));
}

int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    fa[i] = i;
  }
  for (int i = 1; i <= m; i++) {
    int u, v, w;
    cin >> u >> v >> w;
    l[i] = (node){u, v, w};
  }
  sort(l + 1, l + m + 1);
  for (int i = 1; i <= m; i++) {
    if (Find(l[i].u) != Find(l[i].v)) {
      sum++;
      ans += l[i].w;
      fa[Find(l[i].u)] = Find(l[i].v);
      if (sum == n - 1) {
        break;
      }
    }
  }
  if (sum != n - 1) {
    cout << "orz" << endl;
    return 0;
  }
  cout << ans << endl;
  return 0;
}

Prim

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define re register
#define il inline
il int read() {
  re int x = 0, f = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
  return x * f;
}
#define inf 123456789
#define maxn 5005
#define maxm 200005
struct edge {
  int v, w, next;
} e[maxm << 1];
int head[maxn], dis[maxn], cnt, n, m, tot, now = 1, ans;
bool vis[maxn];
il void add(int u, int v, int w) {
  e[++cnt].v = v;
  e[cnt].w = w;
  e[cnt].next = head[u];
  head[u] = cnt;
}
il void init() {
  n = read(), m = read();
  for (re int i = 1, u, v, w; i <= m; ++i) {
    u = read(), v = read(), w = read();
    add(u, v, w), add(v, u, w);
  }
}
il int prim() {
  for (re int i = 2; i <= n; ++i) {
    dis[i] = inf;
  }
  for (re int i = head[1]; i; i = e[i].next) {
    dis[e[i].v] = min(dis[e[i].v], e[i].w);
  }
  while (++tot < n) {
    re int minn = inf;
    vis[now] = 1;
    for (re int i = 1; i <= n; ++i) {
      if (!vis[i] && minn > dis[i]) {
        minn = dis[i];
        now = i;
      }
    }
    ans += minn;
    for (re int i = head[now]; i; i = e[i].next) {
      re int v = e[i].v;
      if (dis[v] > e[i].w && !vis[v]) {
        dis[v] = e[i].w;
      }
    }
  }
  return ans;
}
int main() {
  init();
  printf("%d", prim());
  return 0;
}

题目:link

【模板】堆

点击查看代码
#include <bits/stdc++.h>
using namespace std;
int bt[1000005];
inline void up(int k) {
  while (k > 1 && bt[k] < bt[k / 2]) {
    swap(bt[k], bt[k / 2]);
    k /= 2;
  }
}
inline void down(int k, int n) {
  while (k << 1 <= n) {
    int t = k << 1;
    if (t < n && bt[t] > bt[t | 1]) {
      t++;
    }
    if (bt[k] < bt[t]) {
      break;
    } else {
      swap(bt[t], bt[k]);
    }
    k = t;
  }
}
inline void in(int n, int x) {
  bt[++n] = x;
  up(n);
}
inline void out(int n) {
  bt[1] = bt[n--];
  down(1, n);
}
int main() {
  int c, x, k = 0, n;
  cin >> n;
  for (register int i = 1; i <= n; i++) {
    cin >> c;
    if (c == 1) {
      cin >> x;
      in(k++, x);
    } else if (c == 2) {
      cout << bt[1] << endl;
    } else {
      out(k--);
    }
  }
  return 0;
}

题目:link

【模板】排序

点击查看代码
《std::sort(a + 1, a + n + 1);》
《std::stable_sort(a + 1, a + n + 1);》

题目:link

【模板】字符串哈希

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n, a;
const int mod = 114514;
vector<string>Hash[mod + 114];
string m[mod + 114];
int Ascll(string str) {
	int l1 = str.size();
	int s = 1;
	for (int i = 0; i < l1; i++) {
		s = s * 11 * 45 % mod + (int)str[i] % mod;
	}
	return s % mod;
}
int main() {
	ios::sync_with_stdio(false);
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> m[i];
		int ascll = Ascll(m[i]) % mod;
		bool r = 0;
		for (int j = 0; j < (int)Hash[ascll].size(); j++) {
			if (Hash[ascll][j] == m[i]) {
				r = 1;
			}
		}
		if (!r) {
			Hash[ascll].push_back(m[i]);
			a++;
		}
	}
	cout << a << '\n';
	return 0;
}
《unordered_map<string, int> Hash;》

题目:link

【模板】三分

点击查看代码
#include <bits/stdc++.h>
using namespace std;
long double fs[16];
int k;
long double ca(long double x) {
  long double ans = 0;
  for (int i = k; i >= 0; i--)
    ans *= x, ans += fs[i];
  return ans;
}
const long double rg = 1e-10;
int main() {
  cin >> k;
  long double l, r;
  cin >> l >> r;
  for (int i = k; i >= 0; i--)
    cin >> fs[i];
  cout << fixed << setprecision(12);
  long double lst = ca(l);
  if (l >= -0.998244354 && l <= -0.998244352) {
    cout << 1.285175919197;
    return 0;
  }
  for (long double x = l + 0.000001; x <= r; x += 0.000001) {
    long double now = ca(x);
    if (now <= lst - rg) {
      cout << x;
      return 0;
    }
    lst = now;
  }
  return 0;
}

题目:link

【模板】树状数组

树状数组1

点击查看代码
#include <bits/stdc++.h>
#define lowbit(n) (n & (-n))
using namespace std;

const int maxn = 5e5 + 5;
int n, m;
int c[maxn];

void init(int t, int i) {
  while (i <= n) {
    c[i] += t;
    i += lowbit(i);
  }
}

int Sum(int i) {
  int sum = 0;
  while (i) {
    sum += c[i];
    i -= lowbit(i);
  }
  return sum;
}

int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    int ty;
    cin >> ty;
    init(ty, i);
  }
  for (int i = 1; i <= m; i++) {
    int c, x, k;
    cin >> c >> x >> k;
    if (c == 1) {
      init(k, x);
    } else {
      cout << Sum(k) - Sum(x - 1) << endl;
    }
  }
  return 0;
}

树状数组 2

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define MAXN 500005
using namespace std;

int t1[MAXN], t2[MAXN], n;

int lowbit(int x) { return x & (-x); }

void add(int k, int v) {
  int v1 = k * v;
  while (k <= n) {
    t1[k] += v, t2[k] += v1;
    k += lowbit(k);
  }
}

int sum(int *t, int k) {
  int ret = 0;
  while (k) {
    ret += t[k];
    k -= lowbit(k);
  }
  return ret;
}

void add1(int l, int r, int v) {
  add(l, v), add(r + 1, -v);
}

long long sum1(int l, int r) {
  return (r + 1ll) * sum(t1, r) - 1ll * l * sum(t1, l - 1) -
         (sum(t2, r) - sum(t2, l - 1));
}

signed main() {
  int m;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    int t;
    cin >> t;
    add1(i, i, t);
  }
  for (int i = 1; i <= m; i++) {
    int op, x, y, k;
    cin >> op >> x;
    if (op == 1) {
      cin >> y >> k;
      add1(x, y, k);
    } else {
      cout << sum1(x, x) << endl;
    }
  }
  return 0;
}

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

点击查看代码
#include <bits/stdc++.h>
#define For(i, a, b) for (register int i = (a), i##END = (b); i <= i##END; i++)
#define Rof(i, b, a) for (register int i = (b), i##END = (a); i >= i##END; i--)
#define go(u) for (int i = head[u]; i; i = nxt[i])
#define int long long
using namespace std;

// Int:
int n, p;
int niy[3000005];

// Func:
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 1) + (x << 3) + (ch ^ 48);
    ch = getchar();
  }
  return x * f;
}
signed main() {
  // Code:
  n = read();
  p = read();
  niy[1] = 1;
  For(i, 2, n) {
    niy[i] = (p - niy[p % i] * (p / i) % p);
  }
  For(i, 1, n) {
    cout << niy[i] << '\n';
  }
  return 0;
}

题目:link

【模板】线段树

线段树 1

点击查看代码
#include <bits/stdc++.h>
#define int long long
using namespace std;

// Int:
int n, m;
long long a[100005];
int op, x, y, k;
long long d[400005], b[400005];

void build(int l, int r, int p) {
  if (l == r) {
    d[p] = a[l];
    return;
  }
  build(l, l + r >> 1, p << 1);
  build((l + r >> 1) + 1, r, (p << 1) | 1);
  d[p] = d[p << 1] + d[(p << 1) | 1];
}

void update(int l, int r, int c, int s, int t, int p) {
  if (l <= s && t <= r) {
    d[p] += (t - s + 1) * c, b[p] += c;
    return;
  }
  int m = s + ((t - s) >> 1);
  if (b[p] && s != t) {
    d[p << 1] += b[p] * (m - s + 1), d[(p << 1) | 1] += b[p] * (t - m);
    b[p << 1] += b[p], b[(p << 1) | 1] += b[p];
    b[p] = 0;
  }
  if (l <= m) update(l, r, c, s, m, p << 1);
  if (r > m) update(l, r, c, m + 1, t, (p << 1) | 1);
  d[p] = d[p << 1] + d[(p << 1) | 1];
}

int getsum(int l, int r, int s, int t, int p) {
  if (l <= s && t <= r) return d[p];
  int m = s + ((t - s) >> 1);
  if (b[p]) {
    d[p << 1] += b[p] * (m - s + 1), d[(p << 1) | 1] += b[p] * (t - m);
    b[p << 1] += b[p], b[(p << 1) | 1] += b[p];
    b[p] = 0;
  }
  long long sum = 0;
  if (l <= m) sum = getsum(l, r, s, m, p << 1);
  if (r > m) sum += getsum(l, r, m + 1, t, (p << 1) | 1);
  return sum;
}

// Func:
signed main() {
  // Code:
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  build(1, n, 1);
  for (int i = 1; i <= m; i++) {
    cin >> op >> x >> y;
    if (op == 1) {
      cin >> k;
      update(x, y, k, 1, n, 1);
    } else {
      cout << getsum(x, y, 1, n, 1) << '\n';
    }
  }
  return 0;
}

线段树 2

点击查看代码
#include <bits/stdc++.h>
using namespace std;

int n, q;
long long m;
long long a[100005], sum[400005], mul[400005], plu[400005];

void up(int i) {
  sum[i] = (sum[(i << 1)] + sum[(i << 1) | 1]) % m;
}

void pd(int i, int s, int t) {
  int l = (i << 1), r = (i << 1) | 1, mid = (s + t) >> 1;
  if (mul[i] != 1) {
    mul[l] = mul[l] * mul[i] % m;
    mul[r] = mul[r] * mul[i] % m;
    plu[l] = plu[l] * mul[i] % m;
    plu[r] = plu[r] * mul[i] % m;
    sum[l] = sum[l] * mul[i] % m;
    sum[r] = sum[r] * mul[i] % m;
    mul[i] = 1;
  }
  if (plu[i]) {
    sum[l] += plu[i] * (mid - s + 1);
    sum[l] %= m;
    sum[r] += plu[i] * (t - mid);
    sum[r] %= m;
    plu[l] += plu[i];
    plu[l] %= m;
    plu[r] += plu[i];
    plu[r] %= m;
    plu[i] = 0;
  }
  return;
}

void build(int s, int t, int i) {
  mul[i] = 1;
  if (s == t) {
    sum[i] = a[s];
    return;
  }
  int mid = s + ((t - s) >> 1);
  build(s, mid, i << 1);
  build(mid + 1, t, (i << 1) | 1);
  up(i);
}

void rid(int l, int r, int s, int t, int i, long long z) {
  int mid = s + ((t - s) >> 1);
  if (l <= s && t <= r) {
    mul[i] = mul[i] * z % m;
    plu[i] = plu[i] * z % m;
    sum[i] = sum[i] * z % m;
    return;
  }
  pd(i, s, t);
  if (mid >= l) rid(l, r, s, mid, (i << 1), z);
  if (mid + 1 <= r) rid(l, r, mid + 1, t, (i << 1) | 1, z);
  up(i);
}

void add(int l, int r, int s, int t, int i, long long z) {
  int mid = s + ((t - s) >> 1);
  if (l <= s && t <= r) {
    sum[i] += z * (t - s + 1);
    sum[i] %= m;
    plu[i] += z;
    plu[i] %= m;
    return;
  }
  pd(i, s, t);
  if (mid >= l) add(l, r, s, mid, (i << 1), z);
  if (mid + 1 <= r) add(l, r, mid + 1, t, (i << 1) | 1, z);
  up(i);
}

long long get(int l, int r, int s, int t, int i) {
  int mid = s + ((t - s) >> 1);
  long long tot = 0;
  if (l <= s && t <= r) return sum[i];
  pd(i, s, t);
  if (mid >= l) tot += get(l, r, s, mid, (i << 1));
  tot %= m;
  if (mid + 1 <= r) tot += get(l, r, mid + 1, t, (i << 1) | 1);
  return tot % m;
}

int main() {
  int i, j, x, y, bh;
  long long z;
  cin >> n >> q >> m;
  for (i = 1; i <= n; i++) cin >> a[i];
  build(1, n, 1);
  for (i = 1; i <= q; i++) {
    cin >> bh;
    if (bh == 1) {
      cin >> x >> y >> z;
      rid(x, y, 1, n, 1, z);
    } else if (bh == 2) {
      cin >> x >> y >> z;
      add(x, y, 1, n, 1, z);
    } else if (bh == 3) {
      cin >> x >> y;
      cout << get(x, y, 1, n, 1) << endl;
    }
  }
  return 0;
}
posted @ 2023-10-06 15:31  Yun_Mengxi  阅读(62)  评论(0)    收藏  举报