ACM模板
dlnumk
这个作者很懒,什么都没留下…
展开
-
Gray码
二进制和格雷码的转换 #include using namespace std; int toGray(int x)//二进制转化为格雷码 { return x^(x>>1); } int toBinary(int x)//格雷码转换为二进制 { int y = x; while(x>>=1){ y^=x; } return y; }原创 2017-05-02 10:51:30 · 550 阅读 · 0 评论 -
kmp
这只是最简单的MP算法还可以进行进一步的优化KMP算法主要难点是对next数组的理解void getnext(char *s,int *next)//更新next数组 { int len = strlen(s); next[0] = 0;next[1] = 0; int i,j; for(i = 1;i<len;i++) { j = next[i]; while(j!=0&&...原创 2017-05-02 10:48:55 · 194 阅读 · 0 评论 -
最长公共子序列
//len1为s1长度 len2为S2长度 for(i=0;i<len1;i++) { for(j=0;j<len2;j++) { if(s1[i]==s2[j]) { a[i+1][j+1]=a[i][j]+1; } else原创 2017-05-04 11:07:21 · 170 阅读 · 0 评论 -
最长上升子序列
最长上升子序列: int N,b[1100]={0},MaxLen[1100]={0}; MaxLen[1] = 1; //将信息输入到b数组中 for(i = 2;i<= N;i++)//每次求以第i个数为终点的最长上升子序列的长度 { int nTmp = 0; //记录满足条件的,第i个数左边的上升子序列的最大长度 for(j = 1;原创 2017-05-04 11:06:39 · 190 阅读 · 0 评论 -
最小生成树kruskal模板
//在并查集的前提下,JOIN函数改为成功加入返回true否者false struct Node { int x,y,cost; }node[100005]; void kruskal(){ //将每条边的信息传入 sort(node+1,node+1+cut,cmp); init(); for(i = 1;i<=cut;i++) { if(join(node[i].x,node[i].y)) {原创 2017-05-04 11:05:29 · 185 阅读 · 0 评论 -
并查集模板
int f[10005]; void init() { int i; for(i = 0;i<10005;i++) f[i] = i; } int find(int x)//寻找x的根 { if(f[x] != x) f[x] = find(f[x]); return f[x]; } void join(int x,int y)//讲y放入x的集合中 { int p = find原创 2017-05-04 11:03:39 · 182 阅读 · 0 评论 -
二分答案模板
遇到二分答案的题,只需要改变check里的内容即可bool check(int mid) { if() return true; return false; } l = min; r = max; while(l<=r) { mid = (l+r)/2; if(check(mid)) { ans = mid; l = mid+1; } else原创 2017-05-04 11:01:52 · 285 阅读 · 0 评论 -
分块模板
看了 B站上qsc的视频 学习了分块 也用了qsc分块的做法 其中delong[i]数组用来存放i属于第几块 block代表每块有多少个数,num代表块的数量,l[i]代表i的左边界是多少 r[i]代表i的右边界是多少; int delong[MAXN],block,num,l[MAXN],r[MAXN]; void build() { block = sqrt(n);原创 2017-05-02 18:48:53 · 241 阅读 · 0 评论 -
线段树区间更新 延时标记
struct Tree{ int left,right; long long lazy,sum; void update(long long x){//更新值函数,主要用在延时标记更新的时候 sum +=(right-left+1)*x; lazy+=x; } }tree[N*4];int a[N];线段树空间开数组的4倍 void push_down(int x){//将延时原创 2017-05-02 11:11:01 · 289 阅读 · 0 评论 -
优先队列模板
struct node { int priority ,value; friend bool operator< (node a1,node a2) { return a1.priority 为从大到小排序 } }; int main() { priority_queues;//普通优先级队列 按由大到小排序 priority_queue,greater > s2;//从小到大优先级 队列,将g原创 2017-05-02 11:34:18 · 385 阅读 · 0 评论 -
树状数组
树状数组又叫二叉索引树主要用于单点更新区间求和,树状数组能做得用线段树都可以完成,那为什么还要用树状数组呢,因为树状数组的代码长度太短了。 树状数组的思想是很巧妙的运用了二进制最低位,如果不了解原理的小伙伴可以去B站上面有一个讲的很好的视频去看看,在这里只提供一下模板 视频链接 http://www.bilibili.com/video/av8841769/ int N,c[500005];原创 2017-05-02 11:30:01 · 189 阅读 · 0 评论 -
根据先序和中序重建二叉树:
根据先序和中序建立二叉树主要考察的是对树前序和中序遍历的理解,然后根据反过来递归上去 struct Tree { int value; Tree* lchild,* rchild; }BTree; int Find(int *zhong,int x,int len) { for(int i=0;i<len;i++) {原创 2017-05-02 11:09:15 · 228 阅读 · 0 评论 -
BFS
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//方向向量 struct node{ int x;int y;char c;int step; }map[105][105]; node Next,now; void BFS(){ queues; s.push(map[x][y]); while(!s.empty()){原创 2017-05-02 11:04:20 · 195 阅读 · 0 评论 -
扩展欧几里得求逆元:
int exgcd(int a,int b,int &x,int &y) { if(b==0){ x=1; y=0; return a; } int ans=exgcd(b,a%b,x,y); int temp=x; x=y; y=temp-a/b*y; return ans; } /原创 2017-05-02 11:02:43 · 478 阅读 · 0 评论 -
扩展欧几里得算法
扩展欧几里得算法 算法分析:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。 递归代码 long long extgcd(long long a, long long b, long long &x, long long &y) { long long d, t; if (原创 2017-05-02 10:58:42 · 272 阅读 · 0 评论 -
快速幂(整数)
下面是 m^n % k 的快速幂: // m^n % k int quickpow(int m,int n,int k) { int b = 1; while (n > 0) { if (n & 1) b = (b*m)%k; n = n >> 1 ; m = (m*m)%k;原创 2017-06-07 12:27:37 · 300 阅读 · 0 评论