线性筛素数

(例题 洛谷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. Django中的Object Relational Mapping(ORM)

    ORM 介绍 ORM 概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用 ...

  2. SAS学习笔记25 t检验(单个样本t检验、配对样本t检验、两个独立样本t检验及方差不齐时的t'检验)

    根据研究设计和资料的性质有单个样本t检验.配对样本t检验.两个独立样本t检验以及在方差不齐时的t'检验 单样本t检验 单样本t检验(one-sample t-test)又称单样本均数t检验,适用于样本 ...

  3. 在一台服务器上启动多个Broker

    1:把整个conf文件夹复制一份,比如叫做conf22:修改里面的activemq.xml文件(1)里面的brokerName 不能跟原来的重复(2)数据存放的文件名称不能重复,比如:<kaha ...

  4. 西门子软件sinutrain-for-sinumerik-operate-v4.8安装报错的处理

       西门子软件sinutrain-for-sinumerik-operate-v4.8安装报错的处理 安装时报错提示: 原因: 可能缺少某些文件 处理: 安装 海康ivms-4200后,可直接安装西 ...

  5. (一)JNDI基础

    一.简介 在Tomcat 4.1.27之后,在服务器上就直接增加了数据源的配置选项,直接在服务器上配置好数据源连接池即可.在J2EE服务器上保存着一个数据库的多个连接.每一个连接通过DataSourc ...

  6. java小工具:通过URL连接爬取资源(图片)

    java语言编写一个简单爬取网站图片工具,实现简单: 通过 java.net.HttpURLConnection 获取一个URL连接 HttpURLConnection 连接成功返回一个java.io ...

  7. 使用HTML CSS制作简易三角形和旗帜

    HTML:     <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  8. SVN配置使用及移植

    使用svn作为配置管理工具及其普遍的用于项目开发中,网上有很多关于svn的原理介绍及命令行管理教程.这里仅仅分享下个人配置及使用的过程,不通过命令行,可简单的上手操作.如有遗漏欢迎留言交流. 配置及使 ...

  9. js 获取input type="file" 选择的文件大小、文件名称、上次修改时间、类型等信息

    文件名的传递 ---全路径获取 $('#file').change(function(){ $('#em').text($('#file').val()); }); 文件名的传递 ---只获取文件名 ...

  10. 阿里高级架构师教你使用Spring JMS处理消息事务源码案例

    消费者在接收JMS异步消息的过程中会发生执行错误,这可能会导致信息的丢失.该源码展示如何使用本地事务解决这个问题.这种解决方案可能会导致在某些情况下消息的重复(例如,当它会将信息储存到数据库,然后监听 ...