线性筛素数

(例题 洛谷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 常用模板 手写的更多相关文章

  1. (长期更新)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 ...

  2. 【模板】OI常用模板(待补充)

    //PS:最近修改日期:2017-11-07 20:41:44 首先感觉这种模板类的东西写了还是很有意义的,毕竟时不时的可以拿出来借鉴一下. 现在因为刚开始写这一类的东西,所以说还不是很详细,若有读者 ...

  3. OI常用模板

    long long qpow(long long a,long long b,int mod) { ; while (b) { ) res=res*a%mod; a=a*a%mod; b>> ...

  4. 【Keras案例学习】 多层感知机做手写字符分类(mnist_mlp )

    from __future__ import print_function # 导入numpy库, numpy是一个常用的科学计算库,优化矩阵的运算 import numpy as np np.ran ...

  5. Vue2.0 + ElementUI 手写权限管理系统后台模板(一)——简述

    挤一下: 一开始以为没有多少人用就没建群,但是加我的人太多了,好多问题都是重复的,所以建个群大家互相沟通交流方便点,但是建的有点晚,错过了好多人所以群里人有点少,QQ群: 157216616 小提示 ...

  6. dfs手写栈模板

    在竞赛中如果系统栈很小的话,过深的递归会让栈溢出,这个时候我们就要自己手写栈,将递归转化成手工栈. 方法其实也很简单. 基本思路上,我们就是用栈不断的pop,push.但是何时push,何时pop呢? ...

  7. hdu5183Negative and Positive (NP))——手写Hash&&模板

    题意:问是否存在一段区间其加减交错和为K. 显然,我们可以用set保存前缀和,然后枚举一个端点查找.具体的 若在st1中查找 $t$,为 $sum-t=-k$,在st2中则是 $sum-t=k$. 注 ...

  8. [快速傅立叶变换&快速傅里叶变换]【旧 手写笔记】

    $FFT$好美啊 参考资料: 1.算法导论 2.Miskcoo 3.Menci 4.虚数的意义-阮一峰 简单说一下,具体在下面的图片 实现: 可以用$complex$也可以手写 和计算几何差不多 注意 ...

  9. 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 手写文字识别   ...

随机推荐

  1. 模糊查询库的存储过程(SQLServer)

    --查询带有自己需要内容的存储过程 SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROU ...

  2. echarts的基本使用以及如何使用官方实例的方法

    <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM --> <div id="box" style="width: 600px;heigh ...

  3. [ZJOI2007]捉迷藏 (线段树,括号序列)

    大意: 给定树, 要求维护一个点集, 支持删点添点, 询问点集直径. 本题做法比较多. 一个显然的做法是, 线段树维护区间直径, 然后根据点集直径的性质, 合并后直径端点一定是四个端点其中两个, 枚举 ...

  4. 关于mysql 自增长 主键

    我遇到过 我这样建表 ![](http://images2017.cnblogs.com/blog/1128666/201709/1128666-20170917222547078-151122413 ...

  5. koa2中间件学习笔记

    洋葱模型 整个洋葱就是服务端程序app,每层洋葱皮都是一个中间件,传入requrest,经过各个中间件处理之后传出response. 新建中间件m1.js,m2.js koa-learn/middle ...

  6. svg-sprite-loader ( svg-icon) 使用

    svg-sprite-loader 可以多个svg图标合并. 使用时只需根据合并的symbol的id即可.  <svg class="svg-icon" aria-hidde ...

  7. class类 - extends

    继承是面向对象中一个比较核心的概念.ES6 class的继承与java的继承大同小异,如果学过java的小伙伴应该很容易理解,都是通过extends关键字继承.相较于ES5当中通过原型链继承要清晰和方 ...

  8. JS有关引用对象的拷贝问题

    JS中有关引用对象的拷贝问题 问题描述:在开发过程中,拷贝一个对象数组给另一个数组的时候,改变新数组中对象的属性值,原数组中的对象属性值也跟着改变了. 例如新定义一个数组arr1,里面有两个对象,然后 ...

  9. iOS - 解决警告“ld: Warning: Directory Not Found for Option”

    有时候我们可能从项目中删除了某个目录.文件以后,编译出现警告信息: ld: warning: directory not found for option“XXXXXX” 具体类似下图: 很奇怪,为什 ...

  10. 升级xcode11&ios13的坑

    Swift Packages 目前Pod跟SPM的兼容还没做好,配置好SPM后,Pod不能进行正常更新,先配置好Pod再集成SPM则没有问题 Pod以后的更新可能会解决这个问题,也会有越来越多的库支持 ...