模版大全!!模板大全!!
模版大全!!模板大全!!
今天无事,整理整理自己写过的模版
以后会经常更新模版哦!
冒泡排序(从小到大)
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;
}
浙公网安备 33010602011771号