随笔分类 - 算法
摘要:复杂度O(min(k,n-k)^2)#define LL long long LL gcd(LL a, LL b) { return b? gcd(b, a%b): a;}LL C(int n, int k) { vector<int> vn; k=min(n-k,k); for(int i=n-k+1; i<=n; ++i) { vn.push_back(i); } for(int i=2; i<=k; ++i) { int t = i; for(int j=0; j<vn.size(); ++j) { ...
阅读全文
摘要:poj 2096详解见:http://blog.csdn.net/morgan_xww/article/details/6774708View Code #include<iostream>using namespace std;const int N = 2000;double dp[N][N];int n,s;double dfs(int x,int y){ if(x==n&&y==s) return 0; if(x>n||y>s) return 0; if(dp[x][y]!=0) return dp[x][y]; dp[x+1][y]=dfs(x
阅读全文
摘要:详细讲解 :http://www.byvoid.com/blog/biconnect/求割边模版//hint:所给图必须为连通图const int N=100100;struct cutting_edge{ int cnt,scnt; int dfn[N],low[N],vis[N]; vector< pair<int,int> > G[N]; void init(int n){ for(int i=0;i<=n;i++){ G[i].clear(); vis[i]=0; } } voi...
阅读全文
摘要:Abstract本文要讨论的是一类博弈问题,基于以下条件:1.博弈者人数为两人,双方轮流进行决策。2.博弈状态(对应点)可分为两类(状态空间可分为两个集合),对应二分图两边(X集和Y集)。任意合法的决策(对应边)使状态从一类跳转到另一类。(正是由于这个性质使得问题可以用二分图描述)3.不可以转移至已访问的状态。(不可重复访问点)4.无法转移者判负。Body作者水平有限,欢迎指正。本文要讨论的是一类博弈问题,基于以下条件:1.博弈者人数为两人,双方轮流进行决策。2.博弈状态(对应点)可分为两类(状态空间可分为两个集合),对应二分图两边(X集和Y集)。任意合法的决策(对应边)使状态从一类跳转到另一
阅读全文
摘要:http://hi.baidu.com/czyuan_acm/blog/item/8cc45b1f30cefefde1fe0b7e.html三分法模版double Calc(Type a){ /* 根据题目的意思计算 */}void Solve(void){ double Left, Right; double mid, midmid; double mid_value, midmid_value; Left = MIN; Right = MAX; while (Left + EPS < Right) { mid = (Left + Ri...
阅读全文
摘要:UVALive 5789题意 给你1到n的区间,m组操作每组操作有a,b两个数字, 指将[a,b]变为1,求左右两边最靠近[a,b]区间为0的位置此题所给的m组区间不会相交,开始读题是看错了 ,写了个可能相交的View Code #include<iostream>#include<cstring>#include <cstdio>#include<string>#include<queue>#include<vector>#include<map>#include <set>#include<
阅读全文
摘要://b^(-1)是 b的逆元素 (%p)//2的逆元素是15 (%29) ,因为2*15=30=1 %29//21的逆元素是18 (%29) ,因为21*18=378%29=1 %29//%运算法则 1. (a*b) %p= ( a%p) *(b%p)//%运算法则 2. (a/b) %p= ( a *b^(-1)%p) !!!! // b*b^(-1)= 1 (mod p) 若求b*b的逆元 ,则等同于 ((b*b)%p)*(b*b)^(-1)=1(mod p)#define LL long long LL ex_gcd(LL a,LL b,LL &x,LL &y){ ...
阅读全文
摘要:UVA 11818状态压缩+dp 判断当前点是否为必胜点,则看子节点是否存在必败点 ,若子节点全为必胜点,则当前点为必败点View Code #include<iostream>#include<cstring>#include <cstdio>#include<string>#include<queue>#include<vector>#include<map>#include <set>#include<ctime>#include<cmath>#include <
阅读全文
摘要:异或模版:int A[mMAX][mMAX],ans[mMAX];bool Gauss(int r,int c){ for( int k=0; k<r; k++){ int i ; for(i=k;i<r && A[i][k]==0;i++); if(i==r) continue; if(i > k){ for(int j=0; j<=c; j++) swap(A[i][j], A[k][j]); } for(int i=0; i<...
阅读全文
摘要:zoj 3497http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3497题目意思是给定一个有向图(最多25个节点,每个节点的出度最多为4),给定起点和终点,然后从起点开始走,走到终点就停止,否则一直往下走,问能不能P步到达终点。也就是说从起点出发,走一条长度为P的路径,路径中间点不能经过终点(但可以反复经过其他点)。如果从起点出发P步后,不能到达终点,就是False,如果可以到达终点也可以到其他别的点,就是Maybe,如果P步后只能到达终点(到别的点没有长度为P的路径),则是Yes。显然的矩阵乘法。图的临接矩阵A的p次方
阅读全文
摘要:欧拉数题意:对于任一种N的排列A,定义它的E值为序列中满足A[i]>i的数的个数。给定N和K(K<=N<=1000),问N的排列中E值为K的个数。解法:简单DP。dp[i][j]表示i个数的排列中E值为j的个数。假设现在已有一个E值为j的i的排列,对于新加入的一个数i+1,将其加入排列的方法有三:1)把它放最后,加入后E值不变 2)把它和一个满足A[k]>k的数交换,交换后E值不变 3)把它和一个不满足A[k]>k的数交换,交换后E值+1 根据这三种方法得到转移方程dp[i][j] = dp[i - 1][j] + dp[i - 1][j] * j + dp[i
阅读全文
摘要:状态压缩uva12368-Candles 2011 - Dhaka 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<string> 5 #include<algorithm> 6 #include<math.h> 7 #include<map> 8 #include<queue> 9 using namespace std;10 #define LL long long 11 #define nMAX
阅读全文
摘要:ax+by=gcd(a,b)与ax+by=c 模版 1 LL ext_gcd(LL a,LL b,LL& x,LL& y){ //解 ax+by=gcd(a,b); 2 LL t,ret; 3 if (!b){ 4 x=1,y=0; 5 return a; 6 } 7 ret=ext_gcd(b,a%b,x,y); 8 t=x,x=y,y=t-a/b*y; 9 return ret;10 }11 LL ext(LL a,LL b,LL c){ //解 ax+by=c 12 LL x, y;13 L...
阅读全文
摘要:uva294-Divisors求因子个数和 1 #include<iostream> 2 #include<cstring> 3 #include <cstdio> 4 #include<string> 5 #include<queue> 6 #include<vector> 7 #include<map> 8 #include <set> 9 #include<hash_set>10 #include<ctime>11 #include<cmath>12 #in
阅读全文
摘要:uva679-Dropping Balls有K个球从一完整二元树(fully binary tree, FBT)的树根(root)一个一个往下掉。当这个球遇到非终端节点时,可能往左子树跑,也可能往右子树跑,如此直到这颗球到达终端节点(也就是树叶)为止。至于在非终端节点时球该往左或往右的决定乃是由2个值true, false 来控制的。如果这非终端节点的现在的值为false,则球来的时候会往左子树走,但是这个值会变为true。如果这非终端节点的现在的值为true,则球来的时候会往右子树走,但是这个值会变为false。请注意:一开始时所有非终端节点的值均为false。另外,在完整二元树中所有的节点
阅读全文
摘要:multisetmap<int,multiset<int>> 可用于二维坐标对应的点(并能记录重点)hdu 4022题目大意:在二维平面上,给一些点。有两个操作:给一个d,把所有x为d的点去掉,或把所有y为d的点去掉,问每次去掉的点。 1 #include<iostream> 2 #include<cstdio> 3 #include<vector> 4 #include<string.h> 5 #include<cmath> 6 #include<queue> 7 #include<set&
阅读全文
摘要:kmp 模版传入 主串text,匹配串pat,传出text上数组下标开始为什么时能匹配pat。 如 asdvs sd 传出1。int nxt[MAXN]; //nxt[i] 指下标为i的字符的前面最多nxt[i]个字符与开始的nxt[i]个字符相同 ; int nxt[MAXN];char text[MAXN] ,pat[MAXN];void get_nxt(char *pat,int lenp){ int i = 0, j = -1; nxt[0] = -1; while(i < lenp){ if(j == -1 || pat[i] == pat[j])...
阅读全文
摘要:hdu 1811Rank of Tetris注意一些特殊情况View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<vector> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<cstdlib> 8 #include<algorithm> 9 using namespace std;10 const int MAX=110000;11 const
阅读全文
摘要:最长公共子序列:模版:int dp[MAX][MAX],n; int maxlen(int x[],int y[]){ memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ dp[i][j]=max(dp[i-1][j],dp[i][j-1]); if(x[i]==y[j]){ dp[i][j]=max(dp[i-1][j-1]+1,dp[i][j]); } } } ...
阅读全文
摘要:(本文假设读者已经有以下知识:最短路径的基本性 质、Bellman-Ford算法。) 比如有这样一组不等式: X1 - X2 <= 0 X1 - X5 <= -1 X2 - X5 <= 1 X3 - X1 <= 5 X4 - X1 <= 4 X4 - X3 <= -1 X5 - X3 <= -3 X5 - X4 <= -3不等式组(1) 全都是两个未知数的差小于等于某个常数(大于等于也可以,因为左右乘 以-1就可以化成小于等于)。这样的不等式组就称作差分约束系统。 这个不等式组要么无解,要么就有无数组解。因为如果有一组解{X1, X2, ...,
阅读全文

浙公网安备 33010602011771号