OI 常用模板 手写
线性筛素数
(例题 洛谷P3383)
bool p[50000010];
int cnt = 0;
int prime[10000010];
inline void init()
{
int N = 50000010;
p[0] = p[1] = 1;
for(int i = 2; i <= N; i++)
{
if(!p[i]) prime[++cnt] = i;
for(int j = 1; j <= cnt && prime[j] * i <= N; ++j )
{
p[prime[j] * i] = 1;
if(i % prime[j] == 0)break;
}
}
}
乘法逆元
(例题 洛谷P3811)
公式 :
#include <bits/stdc++.h>
long long a[3000001];
int n,p;
int main()
{
a[1] = 1;
scanf("%d%d",&n,&p);
printf("1\n");
for(int i = 2; i <= n; i++ )
{
a[i] = (long long)((p - (p / i)) * a[p % i]) % p;
while(a[i] < 0)a[i] += p;
printf("%d\n",a[i]);
}
return 0;
}
网络最大流
(例题P3376)(dinic算法)
#include <bits/stdc++.h>
struct Edge
{
int to,next,cap;
}edge[200010];
const int inf = 1 << 29;
int head[10010],d[10010];
int cnt;
int n,m,s,t,maxflow;
std::queue<int> q;
inline void add_edge(int u,int v,int cap)
{
cnt++;
edge[cnt].to = v;
edge[cnt].cap = cap;
edge[cnt].next = head[u];
head[u] = cnt;
}
bool bfs()
{
memset(d, 0, sizeof(d));
while(!q.empty())q.pop();
q.push(s);
d[s] = 1;
while(q.size())
{
int x = q.front();
q.pop();
for(int i = head[x]; i; i = edge[i].next)
{
if(edge[i].cap > 0 && d[edge[i].to] == 0)
{
q.push(edge[i].to);
d[edge[i].to] = d[x] + 1;
}
}
}
return d[t];
}
int dinic(int x, int flow)
{
if(x == t || flow == 0)return flow;
int rest = flow, k;
for(int i = head[x]; i && rest; i = edge[i].next)
{
if(edge[i].cap > 0 && d[edge[i].to] == d[x] + 1)
{
k = dinic(edge[i].to, std::min(rest, edge[i].cap));
if(!k)d[edge[i].to] = 0;
edge[i].cap -= k;
edge[i ^ 1].cap += k;
rest -= k;
}
}
return flow - rest;
}
int main()
{
scanf("%d%d", &n, &m);
scanf("%d%d", &s, &t);
cnt = 1;
for(int i = 1; i <= m; i++)
{
int u, v, c;
scanf("%d%d%d", &u, &v, &c);
add_edge(u, v, c);
add_edge(v, u, 0);
}
int flow = 0,now = 0;
while(bfs())
{
while(flow = dinic(s, inf))maxflow += flow;
}
printf("%d", maxflow);
return 0;
}
欧拉函数
void getphi()
{
phi[1] = 1;
for(int i = 2; i <= n; i++)
{
if(!p[i])
{
prime[++cnt] = i;
phi[i] = i - 1;
}
for(int j = 1; j <= cnt; j++)
{
if(i * prime[j] > n)break;
p[i * prime[j]] = 1;
if(i % prime[j] == 0)
{
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
else phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
拓展欧几里得
inline void exgcd(long long a,long long b,long long &x,long long &y)
{
if(b == 0)
{
x = 1, y = 0;
return;
}
exgcd(b, a % b, y, x);
y -= (a / b * x);
}
Dijkstra + 堆优化
(例题P4779)
#include<bits/stdc++.h>
const int MaxN = 100010, MaxM = 500010;
struct edge
{
int to, dis, next;
};
edge e[MaxM];
int head[MaxN], dis[MaxN], cnt;
bool vis[MaxN];
int n, m, s;
inline void add_edge( int u, int v, int d )
{
cnt++;
e[cnt].dis = d;
e[cnt].to = v;
e[cnt].next = head[u];
head[u] = cnt;
}
struct node
{
int dis;
int pos;
bool operator <( const node &x )const
{
return x.dis < dis;
}
};
std::priority_queue<node> q;
inline void dijkstra()
{
dis[s] = 0;
q.push( ( node )
{
0, s
} );
while( !q.empty() )
{
node tmp = q.top();
q.pop();
int x = tmp.pos, d = tmp.dis;
if( vis[x] )
continue;
vis[x] = 1;
for( int i = head[x]; i; i = e[i].next )
{
int y = e[i].to;
if( dis[y] > dis[x] + e[i].dis )
{
dis[y] = dis[x] + e[i].dis;
if( !vis[y] )
{
q.push( ( node )
{
dis[y], y
} );
}
}
}
}
}
int main()
{
memset( dis, 0x3f, sizeof( dis ) );
scanf( "%d%d%d", &n, &m, &s );
for( register int i = 0; i < m; ++i )
{
register int u, v, d;
scanf( "%d%d%d", &u, &v, &d );
add_edge( u, v, d );
}
dijkstra();
for( int i = 1; i <= n; i++ )
printf( "%d ", dis[i] );
return 0;
}
二分图匹配
(例题P3386)
#include <bits/stdc++.h>
const int MaxN = 1010, MaxM = 500010;
struct edge
{
int to,next;
}e[MaxM << 1];
int head[MaxN],match[MaxN],vis[MaxN];
int ans, cnt;
int n, m;
inline void add_edge(int u, int v)
{
cnt++;
e[cnt].to = v;
e[cnt].next = head[u];
head[u] = cnt;
}
bool dfs(int x)
{
for(int i = head[x]; i; i = e[i].next)
{
int y = e[i].to;
if(!vis[y])
{
vis[y] = 1;
if(!match[y] || dfs(match[y]))
{
match[y] = x;
return true;
}
}
}
return false;
}
int main()
{
int num;
scanf("%d%d%d", &n, &m, &num);
for(int i = 1; i <= num; i++)
{
int u, v;
scanf("%d%d", &u, &v);
add_edge(u, v);
}
for(int i = 1; i <= n; i++)
{
memset(vis, 0, sizeof(vis));
if(dfs(i))ans++;
}
printf("%d", ans);
return 0;
}
Treap
例题 洛谷P3369
//Treap by little_sun
#include <bits/stdc++.h>
using namespace std;
struct node
{
int l; //左儿子
int r; //右儿子
int v; //value
int size; //树大小[节点个数]
int rnd; //随机值
int w; //相同数值个数
} tree[100005];
int n, size, root, ans;
void update(int k) //更新节点信息
{
tree[k].size = tree[tree[k].l].size + tree[tree[k].r].size + tree[k].w;
}
void rturn(int &k) //右旋
{
int t = tree[k].l;
tree[k].l = tree[t].r;
tree[t].r = k;
tree[t].size = tree[k].size;
update(k);
k = t;
}
void lturn(int &k) //左旋
{
int t = tree[k].r;
tree[k].r = tree[t].l;
tree[t].l = k;
tree[t].size = tree[k].size;
update(k);
k = t;
}
void insert(int &k, int x) //插入
{
if (k == 0)
{
size++;
k = size;
tree[k].size = tree[k].w = 1;
tree[k].v = x;
tree[k].rnd = rand();
return;
}
tree[k].size++;
if (tree[k].v == x)
tree[k].w++;
else if (x > tree[k].v)
{
insert(tree[k].r, x);
if (tree[tree[k].r].rnd < tree[k].rnd)
lturn(k);
}
else
{
insert(tree[k].l, x);
if (tree[tree[k].l].rnd < tree[k].rnd)
rturn(k);
}
}
void del(int &k, int x) //删除
{
if (k == 0)
return;
if (tree[k].v == x)
{
if (tree[k].w > 1)
{
tree[k].w--;
tree[k].size--;
return;
}
if (tree[k].l * tree[k].r == 0)
k = tree[k].l + tree[k].r;
else if (tree[tree[k].l].rnd < tree[tree[k].r].rnd)
rturn(k), del(k, x);
else
lturn(k), del(k, x);
}
else if (x > tree[k].v)
{
tree[k].size--;
del(tree[k].r, x);
}
else
{
tree[k].size--;
del(tree[k].l, x);
}
}
int query_rank(int k, int x)
{
if (k == 0)
return 0;
if (tree[k].v == x)
return tree[tree[k].l].size + 1;
else if (x > tree[k].v)
return tree[tree[k].l].size + tree[k].w + query_rank(tree[k].r, x);
else
return query_rank(tree[k].l, x);
}
int query_num(int k, int x)
{
if (k == 0)
return 0;
if (x <= tree[tree[k].l].size)
return query_num(tree[k].l, x);
else if (x > tree[tree[k].l].size + tree[k].w)
return query_num(tree[k].r, x - tree[tree[k].l].size - tree[k].w);
else
return tree[k].v;
}
void query_pro(int k, int x)
{
if (k == 0)
return;
if (tree[k].v < x)
{
ans = k;
query_pro(tree[k].r, x);
}
else
query_pro(tree[k].l, x);
}
void query_sub(int k, int x)
{
if (k == 0)
return;
if (tree[k].v > x)
{
ans = k;
query_sub(tree[k].l, x);
}
else
query_sub(tree[k].r, x);
}
int main()
{
scanf("%d", &n);
int opt, x;
for (int i = 1; i <= n; i++)
{
scanf("%d%d", &opt, &x);
if (opt == 1)
insert(root, x);
if (opt == 2)
del(root, x);
if (opt == 3)
printf("%d\n", query_rank(root, x));
if (opt == 4)
printf("%d\n", query_num(root, x));
if (opt == 5)
{
ans = 0, query_pro(root, x), printf("%d\n", tree[ans].v);
}
if (opt == 6)
{
ans = 0, query_sub(root, x), printf("%d\n", tree[ans].v);
}
}
return 0;
}
OI 常用模板 手写的更多相关文章
- (长期更新)OI常用模板
代码很简单的模板就不收录了. DFT 离散傅立叶变换 void dft(pdd *a,int l,bool r){ int i,j=l/2,k; for(i=1;i<l;++i){ if(i&l ...
- 【模板】OI常用模板(待补充)
//PS:最近修改日期:2017-11-07 20:41:44 首先感觉这种模板类的东西写了还是很有意义的,毕竟时不时的可以拿出来借鉴一下. 现在因为刚开始写这一类的东西,所以说还不是很详细,若有读者 ...
- OI常用模板
long long qpow(long long a,long long b,int mod) { ; while (b) { ) res=res*a%mod; a=a*a%mod; b>> ...
- 【Keras案例学习】 多层感知机做手写字符分类(mnist_mlp )
from __future__ import print_function # 导入numpy库, numpy是一个常用的科学计算库,优化矩阵的运算 import numpy as np np.ran ...
- Vue2.0 + ElementUI 手写权限管理系统后台模板(一)——简述
挤一下: 一开始以为没有多少人用就没建群,但是加我的人太多了,好多问题都是重复的,所以建个群大家互相沟通交流方便点,但是建的有点晚,错过了好多人所以群里人有点少,QQ群: 157216616 小提示 ...
- dfs手写栈模板
在竞赛中如果系统栈很小的话,过深的递归会让栈溢出,这个时候我们就要自己手写栈,将递归转化成手工栈. 方法其实也很简单. 基本思路上,我们就是用栈不断的pop,push.但是何时push,何时pop呢? ...
- hdu5183Negative and Positive (NP))——手写Hash&&模板
题意:问是否存在一段区间其加减交错和为K. 显然,我们可以用set保存前缀和,然后枚举一个端点查找.具体的 若在st1中查找 $t$,为 $sum-t=-k$,在st2中则是 $sum-t=k$. 注 ...
- [快速傅立叶变换&快速傅里叶变换]【旧 手写笔记】
$FFT$好美啊 参考资料: 1.算法导论 2.Miskcoo 3.Menci 4.虚数的意义-阮一峰 简单说一下,具体在下面的图片 实现: 可以用$complex$也可以手写 和计算几何差不多 注意 ...
- Atitit s2018.2 s2 doc list on home ntpc.docx \Atiitt uke制度体系 法律 法规 规章 条例 国王诏书.docx \Atiitt 手写文字识别 讯飞科大 语音云.docx \Atitit 代码托管与虚拟主机.docx \Atitit 企业文化 每日心灵 鸡汤 值班 发布.docx \Atitit 几大研发体系对比 Stage-Gat
Atitit s2018.2 s2 doc list on home ntpc.docx \Atiitt uke制度体系 法律 法规 规章 条例 国王诏书.docx \Atiitt 手写文字识别 ...
随机推荐
- pytorch报错:AttributeError: 'module' object has no attribute '_rebuild_tensor_v2'
转载自: https://blog.csdn.net/qq_24305433/article/details/80844548 由于训练模型时使用的是新版本的pytorch,而加载时使用的是旧版本的p ...
- Keras 训练 inceptionV3 并移植到OpenCV4.0 in C++
1. 训练 # --coding:utf--- import os import sys import glob import argparse import matplotlib.pyplot as ...
- 搭建nginx静态资源站
搭建静态资源站包括以下几部分: root指令与alias指令的区别 使用gzip压缩资源 如何访问指定目录下的全部资源文件 如何限制访问流量 如何自定义log日志 root指令与alias指令的区别 ...
- 如何结合插件 vue-lazyload 来简单实现图片懒加载?
插件地址:https://www.npmjs.com/package/vue-lazyload: 一.使用场景: 在项目中有很多条数的信息,且图片很多的时候,不需要一次把整个页面的图片都加载完,而是在 ...
- 移动端适配flexible.js
npm install lib-flexible --save npm install px2rem-loader --save-dev
- from表单中checkbox的多选,ajax转入后台,后台接受
var check = [];//定义一个空数组 $("input[name='category']:checked").each(function(i){//把所有被选中的复选框 ...
- Java基础加强-泛型
/*泛型*/ (泛型是给编译器看的) 泛型是提供给 /*javac编译器使用的*/,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型带类型说明的集合时,会去掉 "类 ...
- java - day008 - 接口,内部类
接口 作用: 结构设计工具,用来解耦合,需要有子类,隔离具体实现 接口是一个极端的抽象类 用 interface 代替 class 用 implements 代替 extends // 接口中所有东西 ...
- CentOS7使用Qemu模拟ARM64
准备 RPM包安装 yum安装交叉编译工具 yum install -y binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu bison flex gli ...
- 《数据结构与算法之美》 <06>栈:如何实现浏览器的前进和后退功能?
浏览器的前进.后退功能,我想你肯定很熟悉吧? 当你依次访问完一串页面 a-b-c 之后,点击浏览器的后退按钮,就可以查看之前浏览过的页面 b 和 a.当你后退到页面 a,点击前进按钮,就可以重新查看页 ...