线性筛素数

(例题 洛谷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. java-TheadPoolExecutor

    Executor的两极调度模型 第一级:java多线程程序把应用分解为若干个任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定数量的线程: 第二级:操作系统内核将这些线程映射到处 ...

  2. Linux下PHP7.2扩展

    前言 由于公司某项目需要连接oracle数据库,该项目使用的开发语言为PHP,故需要对PHP进行扩展 环境说明 服务器:Centos7 PHP:7.2, 源码安装;安装路径:/usr/local/xx ...

  3. sublime text 2 + Dev-C++/MinGW 组合配置更方便快捷的 C/C++ 编译环境

    首先看一下配置后的效果: 1.直接在底部文本框中显示运行结果(不需要从键盘输入的时候使用): 2.在cmd中运行结果(需要从键盘输入的时候使用): 快捷键说明: 运行: 在底部文本栏显示结果:Ctrl ...

  4. SpringCloud Hystrix/Feign 整合 Hystrix 后首次请求失败解决方案

  5. WebSocket协议探究(三):MQTT子协议

    一 复习和目标 1 复习 Nodejs实现WebSocket服务器 Netty实现WebSocket服务器(附带了源码分析) Js api实现WebSocket客户端 注:Nodejs使用的Socke ...

  6. 用Altium Designer16 绘制STM32开发板PCB 笔记

    第一部分 Altium designer 软件概括 一.安装:要安装英文版,只安装pcb design和importers/exporters 二.设置:dxp-preferences我们关心的是sy ...

  7. Rsync同步过程中遇到的常见问题

    一.Rsync服务介绍 Rsync属于一款实现全量及增量同步数据的软件工具,适用于unix/linux/windows等多种操作系统平台. Rsync软件能实现本地复制,远程复制,或者远程守护进程方式 ...

  8. JS错误信息类型

    1.SyntaxError 语法错误 ①变量名不规范 // 变量名不规范 var 1 = 1; 未被捕获的语法错误,这个错误是js机制自动抛出来的 意外的数字 // 下面两个是同一种情况 var 1a ...

  9. Computer Vision_33_SIFT:PCA-SIFT A More Distinctive Representation for Local Image Descriptors——2004

    此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...

  10. 服务器IP与个人IP的特点

    服务器IP:系统类型.开放的端口及运行的服务.C段同类机器数量.是否机房.IDC服务商 个人IP:系统类型.开放的端口及运行的服务……