- 博客(27)
- 收藏
- 关注
原创 topo排序(入度法)(可判断topo排序是否唯一)
int G[maxn][maxn],indegree[maxn],topo[maxn],n,m; //topo[]可打印topo排序void Addedge(int u,int v) //添加有向边u->v{ G[u][v]=1; indegree[v]++; //终点入度+1}void init() //初始化边和入度{ memset(
2015-08-20 10:38:33 1496
原创 Lucas大组合数模板
typedef long long ll;struct Lucas { ll n, m, p; ll qPow (ll a, ll k) { ll ans = 1; while (k) { if (k&1) ans = (ans * a) % p; a = (a * a) % p; k /= 2; } return ans; } ll C (ll a, ll b) { if (a a - b)
2015-08-20 10:32:11 1589
原创 RMQ模板
int d[50000][40];vector A;void RMQ_init(const vector & A){ //RMQ 初始化 int n=A.size(); for(int i=0;i<n;i++)d[i][0]=A[i]; for(int j=1;(1<<j)<=n;j++) for(int i=0;i+(1<<j)-1<n;i+
2015-08-20 10:28:58 1849
原创 矩阵快速幂
#define LL long longint mod = 1000000007;int n; //矩阵宽度const int maxn=100; //maxn不要超过160struct Mat //矩阵结构体{ LL mat[maxn][maxn];};Mat operator * (Mat a, Mat b) //2个边长为n的正方形矩阵乘法 a*b mod p
2015-08-20 10:27:14 1790
原创 网络流(dinic算法)
const int maxn=50050;const int INF=0x7fffffff;#define M 11#define LL long longstruct Edge{ int from,to,cap,flow; Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f){}};struct Dinic
2015-08-20 10:13:03 1931
原创 整数划分模板
//模板long long dp[1005][1005];long long f(int n,int m){ //返回和为n,每个数不超过m的划分个数 n,m都不能为0 if(dp[n][m]) return dp[n][m]; if(n==1||m==1) return dp[n][m]=1; if(m>n) return dp
2015-08-20 10:08:11 1915
原创 KMP及相关算法
int next[1000070]; //next 数组int ans;void getNext(char *p,int *next) //构造next数组{ int j=0,k=-1; next[0]=-1; int len=strlen(p); while(j<len) { if(k==-1||p[j]==p[k])
2015-08-20 10:00:09 1794
原创 AC自动机
#include#include#include#include#includeusing namespace std;const int maxnode=1000007;const int SIGMA_SIZE=26; //若字符串可能出现所有字符,则要将该值改为128,并且将idx函数中“ -‘a’ "去掉//给定多个模板,一个文本,能够找出模板在文本中的位置与附加信息va
2015-08-20 09:48:37 1840
原创 树状数组
const int maxn=10010; //树状数组可能的最大长度struct BIT { //设树状数组为A[],下标从1开始 int N; int C[maxn]; //辅助数组 void init(int BIT_size) { //初始化,BIT_size 为树状数组的长度 N=BIT_size; memset(C,0,s
2015-08-19 17:03:41 1840
原创 Hash
const int hashsize = 1000003;const int maxstate = 1000000;typedef int State;int head[hashsize],Next[maxstate];State st[maxstate];//需要定义一个状态数组int id=0;//状态数组的下标,访问状态void init(){memset(head,0,size
2015-08-19 16:55:03 1885
原创 K-d Tree 模板
typedef long long LL;typedef pair PII;typedef pair pii;const int maxn = 1000005; //点的数量const int maxD = 2; //维数,根据题目维数修改此处const int maxM = 12;const LL INF = 4611686018427387903LL;int now;s
2015-08-19 16:51:19 2247
原创 字典树模板
const int maxnode=100003;const int sigma_size=26; //字符集大小,注意idx函数也要随着修改struct Trie{ int ch[maxnode][sigma_size]; int val[maxnode]; int sz; void init() { sz=1;memset(ch[0],0,sizeof(c
2015-08-19 16:48:54 2089
原创 二维线段树(单点更新)
#include #include #include #include #include #include #include using namespace std;const int INF=1<<30;const int maxn=2000+10;struct INtervalTree2D{ //2维线段树x轴y轴的下标均从1开始 int Max[maxn][maxn
2015-08-19 16:45:51 1830
原创 线段树(求矩形并,交,并减交的面积)
# define N 100100int e; //记录横坐标个数,注意主函数里不要有同名变量struct node1{ double x,y1,y2; int f;} line[N*2];struct node2{ double rf,lf,cnt,incnt; //求矩形交可以没有cnt,求矩形并可以没有incnt int l,r,c;} tr
2015-08-19 16:43:39 1997
原创 线段树(求矩形周长)
# define N 5005int e;struct node1 { int x,y1,y2; int f;} line[2*N];struct node2 { int l,r; int lf,rf;/*左右区间所对应的y值*/ int cnt;/*节点上线段的测度*/ int count;/*节点被线段完全覆盖的次数*/ int
2015-08-19 16:34:48 2080
转载 几个基础数位DP (hdu 2089,hdu 3555 ,uestc 1307 windy 数)
HDU 2089 不要62http://acm.hdu.edu.cn/showproblem.php?pid=2089不能出现4,或者相邻的62,这题可以暴力打表解决具体的在代码里都有解释 #include #include #include #include #include #include #define N 55 #define inf
2015-08-19 16:30:09 1829
原创 多重背包 (n种物品,每种m个)
const int MAXV = 1 << 9;int d[MAXV],v,w;int m,n,V; //背包大小为V,n种物品,每种物品m个void ZeroOnePack( int* f, int C, int W) { //01背包 int v; for( v = V; v >= C; v --) f[v] = max( f[v], f[v - C]
2015-08-19 16:29:10 3494
原创 二分图-最大匹配,最小路径覆盖,最小点覆盖(KM算法)
正式的定义,网上一大把,但他们的作用是让人看不懂……二分图:把点分成两个集合X,Y,使得图的边的两个端点总是分别落在X和Y上,不会有X中的点连向X中的点,不会有Y中的点连向Y中的点匹配:实质上是二分图中的一个边集,边集中出现的点不会重合,比如有a-b了,就不会有a-c了,要是有了a就重合了最大匹配:这个边集的数目最大的那个匹配匈牙利算法——增广路:一条在X和
2015-08-19 16:26:05 2926
原创 求无向图的 边-双连通分量
/*去掉桥,其余的连通分支就是边双连通分支了。一个有桥的连通图要变成边双连通图的话,把双连通子图收缩为一个点,形成一颗树。通过遍历所有桥来统计缩点树的各结点度数,需要加的边为(leaf+1)/2(leaf 为叶子结点个数)*/const int MAXN = 5010;//点数const int MAXM = 20010;//边数,因为是无向图,所以这个值要*2struct Edge {
2015-08-19 16:20:28 943
原创 求无向图割顶,桥,删除点后增加的连通块数
const int MAXN=10010,MAXM=100010;//点的下标切记转换成由1~nstruct Edge{ int to,next; bool cut; //是否为桥的标记*******}edge[MAXM]; //边数组/* 遍历点u的临接边 for(int i=head[u];i!=-1;i=edge[i].next) { edg
2015-08-19 16:16:03 2315
原创 二维几何模板(刘汝佳)
#include #include #include #include #include #include #include #include using namespace std;const double PI=acos(0)*2;struct Point{ double x,y; Point(double x=0,double y=0):x(x),y(
2015-08-19 16:14:01 3652
原创 求半平面交的点集
///////////////////////////////////////////////////////////////////////////////////////////////struct Line { //定义直线类型 Point P; // 直线上任意一点 Vector v; // 方向向量 double ang; // 极角,即从
2015-08-19 16:12:11 2062
原创 求三角形外心,两圆相交面积
三点求圆心坐标(三角形外心)//过三点求圆心坐标Point waixin(Point a,Point b,Point c) { double a1 = b.x - a.x, b1 = b.y - a.y, c1 = (a1*a1 + b1*b1)/2; double a2 = c.x - a.x, b2 = c.y - a.y, c2 = (a2*a2 + b2*b2)/2;
2015-08-19 16:09:33 2533
原创 凸包,旋转卡壳模板
//////////////////////凸包/////////////////////////// int ConvexHull(Point *p,int n,Point* ch) { //返回凸包顶点数,凸包顶点存在ch中 sort(p,p+n); int m=0; for(int i=0; i1&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2
2015-08-19 15:59:17 2166
原创 2维fenwick树
const int MAXH=107,MAXW=107;struct Fenwick { int W,H; int mat[MAXH][MAXW]; void init(int w,int h){ //初始化矩阵 memset(mat,0,sizeof(mat)); W=w,H=h; } int lowbit(int
2015-08-19 15:53:36 2011
原创 WEB开发笔记
集合:List:(列表) add get(index) 返回下标所对应元素 iterator() remove() 删除集合元素Iterator it=list.iterator(); //迭代器遍历while(it.hasNext()){ System.out.print(it.n
2015-08-19 15:51:43 1848
原创 SPFA算法
const int maxn=1007;const int INF=0x7fffffff;struct Edge { int from ,to, dist; Edge(int u,int v,int d):from(u),to(v),dist(d) {}};struct SPFA { int n,m; vector edges; vector G[m
2015-08-19 15:46:23 1815
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人