线性筛素数

(例题 洛谷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. 【规律】Cunning Friends

    Cunning Friends 题目描述 Anthony and his friends Ben and Chris decided to play a game. They have N piles ...

  2. react项目中canvas之画形状(圆形,椭圆形,方形)

    组件DrawShape.jsx如下: import React, { Component } from 'react' // import ClassNames from 'classnames' i ...

  3. oracle 、mysql 取昨天 前天 本周 数据

    查询今天数据: SELECT COUNT(1) FROM T_CALL_RECORDS WHERE TO_CHAR(T_RKSJ,'YYYY-MM-DD')=TO_CHAR(SYSDATE,'YYYY ...

  4. SpringBoot 第二篇:SpringBoot配置文件使用

    背景 项目跑起来,和以前相比,现在的配置文件能干什么?SpringBoot 项目的配置文件就是创建项目时,自带的 application.properties ,打开里面空空如也.这个文件里面的语法是 ...

  5. (二十一)JSP基础

    定义 JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写html,但它相 ...

  6. (四)Hibernate的增删改查操作(1)

    Hiberntae的查找操作有多种: 1.  使用Criteria接口查询 Query_Criteria.java package action; import java.util.ArrayList ...

  7. 【Transact-SQL】计算整个表中所有值的出现的次数

    原文:[Transact-SQL]计算整个表中所有值的出现的次数 一个表有3列,5行,那么一共有15个值,现在要计算整个表中所有值在表中出现的次数,不过这里表的列数是不确定的,上面的例子是3列,实际上 ...

  8. VUE.js devtool 安装简易教程(转)

    最简便的方法是用FQ来通过google应用商店进行安装,但是大多数人还是处在非FQ的状态 尝试过安装Node的方法来安装,但是极其不建议用这个方法安装,非常麻烦,而且必须要有node的基础,非常不接地 ...

  9. 冒泡(bubblesort)、选择排序、插入排序、快速排序

    冒泡排序(bubblesort) 特点:通过换位置的方式,一直向上冒泡 package main import "fmt" func bubbleSortAsc(arrayA [] ...

  10. Oracle中select 1和select *的区别

    转自:https://www.linuxidc.com/Linux/2010-05/26202.htm 创建myt表并插入数据,如下: create table myt(name varchar2,c ...