随笔分类 - 模版
虽然模版能减少思维复杂度,但是还是希望能早点脱离模版。
摘要:http://poj.org/problem?id=1811View Code /*=====================================================*\| Miller Rabin 判断一个大数是不是素数 | Pollard 找出因子\*=====================================================*/#define inf 0x3f3f3f3f#define linf inf*inf#define SS 8//Miller测试次数#define C 240typedef long long ll;ll N,
阅读全文
摘要:http://poj.org/problem?id=3678典型的2-sat裸题View Code /*====================================================*\| 2-sat问题:判断某个数的0或1的取值是否存在满足条件的解\*====================================================*/const int MM = 222222;int N, M;bool inq[MM];int cur,cnt,belong[MM];int stack[MM], top,dfn[MM], low[MM];int
阅读全文
摘要:View Code const int maxn = 111; //方程大小int m, n; // 行号 列号double a[maxn][maxn], x[maxn]; //x为结果void Gauss() { double d = 0, t = 0, sum = 0; int k = 1, l = 0, i = 0, j = 0; while (k <= n) { //*****选主元素***** d = a[k][k]; l = k; ...
阅读全文
摘要:http://poj.org/problem?id=1330View Code const int MM = 22222;int N, in[MM], root;int head[MM],NE;struct Edge{ int u,v,next;}edge[MM];bool vis[MM];int ief,level;int dp[MM][17]; //节点数*2int E[MM], L[MM], H[MM]; //节点数*2int log_2(int x) { int res=-1; while(x) x>>=1,res++; return res;}void add...
阅读全文
摘要:View Code #define ROOT 0const int MAX_NODE=100100;//stringnum*stringlenconst int CHI=26; //儿子数struct ACtree { int size; int hash[300]; int val[MAX_NODE]; int fail[MAX_NODE]; int SQ[MAX_NODE]; int chd[MAX_NODE][CHI]; void get_hash() { int i,j,k; for(i=0;i<CHI;i++) ...
阅读全文
摘要:http://poj.org/problem?id=2186View Code const int MM = 11111;#define debug puts("wrong")typedef __int64 int64;int N,M;vector<int>edge[MM];const int maxn = 11111; //节点数bool instack[maxn];int ief,top,bcnt,st[maxn];int low[maxn],dfn[maxn],belong[maxn];int out[MM];void get_data() { int i
阅读全文
摘要:View Code //Raney引理:设整数序列A={Ai,i=1,2,...,N},且部分和为Sk=A1+,...,+Ak,序列中的所有的数字之和为Sn=1; 则在A的N个循环表示中,有且仅有一个序列B,满足B的任意部分和Si均大于零。//证明由于Sn=1,则Sk+Sn=Sk+1,存在这样一个数x,当在x和x+1之间的某点过后,其后所有的点都在0以上。 //序列// 一个序列{Ai,i=0,1,2,....,3n},由 3n+1项组成,每一项是1或-2。定义部分和Sk=A0+A1+...+Ak,求所有满足S3n=1,而且对k=0,1,...3n,Sk>0,的序列的个数。// ...
阅读全文
摘要:http://poj.org/problem?id=2663View Code //放骨牌类问题,dfs枚举方法,递推。 const int MM = 1111;#define debug puts("wrong")typedef __int64 int64;int64 N,M,dp[111][11];void dfs(int64 row,int64 col,int64 pre,int64 now,int64 ss) { if(col>=3) { if(pre==7) dp[row][now]+=ss; return; } if((pre&(1<<
阅读全文
摘要:参考:http://en.wikipedia.org/wiki/3SUM//choose three number from a set,then a+b+c=0View Code //choose three number from a set,then a+b+c=0//其实就是两头逼近,复杂度O(N^2)void threesum(int n,int*val) { int i,j,k,a,b,c,tmp,l; sort(val,val+n); for(i=0;i<n-2;i++) { a=val[i], j=i+1, k=n-1; while...
阅读全文
摘要:View Code //Catalan数//h[0]=h[1]=1//h[n]=sum(h[i]*h[n-i-1]) (n>i>=0)//递推关系:h[n]=C(2n,n)/(n+1);//1.括号化问题。//1.1 矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)//2.出栈次序问题。//2.1 一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?//2.2 有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外
阅读全文
摘要:map STLView Code //map<vector<int>,int>vis; 可以对一个list进行映射。//类似于map<map<int,int>,int>vis 之类的都是可以做到的,注意键值需要一一对应。//begin() 返回指向map头部的迭代器//clear() 删除所有元素//count() 返回指定元素出现的次数//empty() 如果map为空则返回true//end() 返回指向map末尾的迭代器//erase() 删除一个元素//find() 查找一个元素 //if(vis.find(x)!=vis.end())/
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4389View Code const int MM = 1111;typedef __int64 int64;#define debug puts("wrong")int N,M;int num[MM], cnt;int dp[10][82][82][82];int dfs(int le,int sum,int mod,int r,bool less) { //less前一位是否取到最大e=less?num[le]:9 if(sum>mod) return 0; if(le==-1)
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3507View Code const int MM = 555555;#define debug puts("wrong")#define mod 100000000typedef __int64 int64;int N,M;int val[MM],sum[MM], dp[MM];int head,tail,sq[MM];/***************\斜率优化DP dp[i]=min(dp[j]+sqr(sum[i]-sum[j])+M | 1<=j<i)对于队尾a b ,
阅读全文
摘要:View Code struct Info{ int val,key; bool friend operator<(Info x,Info y) { return x.val>y.val; //定义比较,默认按照val大->小排序 }};multiset<int, greater<int> > sbt;//头文件:#include <set>//multiset<int> sbt; //默认小到大//multiset<int, greater<int> > sbt; //定义大到小//元素键值允许重复 O
阅读全文
摘要:http://www.nocow.cn/index.php/Treap_C%2B%2BView Code /*****************************************\treap完成插入,删除,查找第K个数询问x在序列中为名次,返回最小值\*****************************************/const int inf=~0U>>1;class treap { struct node { int value,key,size; node(int v,node*n):value(v) {c[0]=c[1]=n...
阅读全文
摘要:View Code /*==================================================*\| 求解 C(n,m)%p 保证p为素数n很大10^9 m很小10^5\*==================================================*/typedef __int64 int64;int64 N,M, mod;int64 p[MM];void get_data() { int i,j,k; scanf("%I64d%I64d%I64d",&N,&M,&mod);}int64 exp_
阅读全文
摘要:View Code /*==================================================*\| 比较高效的大数| < , <= , + , - , * , / , %(修改/的最后一行可得)\*==================================================*/const int maxn = 1111; //最大长度const int base = 10000; //%04dstruct bint { int ln, v[maxn]; bint (int r) { memset(v,0,size...
阅读全文
摘要:View Code inline bool scan_d(int &num) { // 外挂输入 char in;bool IsN=false; in=getchar(); if (in == EOF) return false; while (in!='-' &&( in<'0'||in>'9')) in=getchar(); if (in == '-') { IsN=true;num=0;} else num=in-'0'; while (in=getchar(),in>
阅读全文
摘要:Graham求凸包 O(N * logN)View Code /*==================================================*\| Graham求凸包 O(N * logN)| CALL: nr = graham(pnt, int n, res);|pnt[]为给定点集 n为点的个数 res[]为凸包点集;\*==================================================*/struct Tpoint {int x,y;}g[MM]; //注意点的类型Tpoint res[MM];bool mult(Tpoint
阅读全文
摘要:View Code //头文件:#include <algorithm>//O(N!)const int maxn = 1000; int num[maxn];void permut(int n) { //n:元素个数 int i,j,k; sort(num,num+n); //注意排序 do { for(i=0;i<n;i++) printf("%d ",num[i]); printf("\n"); }while(next_permutation(num,num+n));}
阅读全文