各种模板
【模板】栈
点击查看代码
#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;
}

浙公网安备 33010602011771号