04 2013 档案
摘要: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元钞票,另外
阅读全文
摘要:http://www.codeforces.com/problemset/problem/55/DView Code //dp[i][j][k] 表示长度为i的,对2520取模为j的,最小公倍数为k的数的个数,1~9最小公倍数只有48个,预处理出来。const int MM = 11111;typedef __int64 int64;#define mod 2520#define debug puts("wrong")int64 N,L,R;int num[MM],cnt;int64 dp[19][2520][50];int id[MM], g;void get_init(
阅读全文
摘要: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.zju.edu.cn/onlinejudge/showProblem.do?problemId=4013记忆化搜索,学到啦用map做映射不用担心数组开多大的问题,还有map<vector<int>,int>vis;可以对一个list进行映射,由于10^9以内的素数因子的组合很少,可以记忆化。View Code //记忆化搜索,学到啦用map做映射不用担心数组开多大的问题,还有map<vector<int>,int>vis;//可以对一个list进行映射,由于10^9以内的素数因子的组合很少,可以记忆化。const int M
阅读全文
摘要:[转]:http://hi.baidu.com/daizhy_acm/item/5c7e60dfcf33a1f8ca0c393eView Code 网络流题目集锦最大流 POJ 1273 Drainage Ditches POJ 1274 The Perfect Stall (二分图匹配) POJ 1698 Alice's Chance POJ 1459 Power Network POJ 2112 Optimal Milking (二分) POJ 2455 Secret Milking Machine (二分) POJ 3189 Steady Cow Assignment (枚举)
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3652View Code //dp[i][j][3] //表示前i个字符,余数为j //0 存在13,1前一个是1 ,2什么都没有const int MM = 1111;typedef __int64 int64;#define debug puts("wrong")#define mod 13int N,M;int num[MM], cnt;int dp[11][15][3]; //0 have 13 // 1 pre=1 // 2 noint dfs(int le,int r,int
阅读全文
摘要: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 ,
阅读全文
摘要:http://acm.fzu.edu.cn/problem.php?pid=2107状态压缩DP,dp[i][j][k] 表示前i行j状态,有没有2*2普通放板的问题。深搜枚举的过程中记录当前和转移到的状态。View Code const int MM = 1111;typedef __int64 int64;#define debug puts("wrong")int N,M,L,ans,ss;char str[MM];int num[MM];int dp[10][32][3]; //0 no 1 yesvoid get_data() { int i,j,k; scanf
阅读全文
摘要: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://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=49950-1背包,按照时间排序保证总时间最小。以后写if-else注意多continue,还有0-1背包不需要多加一维。以后注意。View Code const int MM = 1111;#define debug puts("wrong")//typedef __int64 int64;int N,M;int dp[MM][4];struct Info{int t,v;}g[MM];bool cmp(Info x,Info y) {return x.t
阅读全文
摘要: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...
阅读全文
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1684kmpView Code const int MM = 1111111;#define debug puts("wrong")typedef __int64 int64;char str[MM], ch[MM];int n,m;int fail[MM], ans[MM], cnt;void get_next(int n) { int i, j=-1; for(fail[0]=-1, i=1;i < n; i++) { while(j>=0 &&
阅读全文
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1682记录取模的余数,并查集。View Code const int MM = 511111;#define debug puts("wrong")typedef __int64 int64;int64 N;bool vis[MM];vector<int64>g[MM];vector<int64>gg[MM]; //^2int64 fa[MM], ran[MM];int64 getfa(int64 x) {return x==fa[x]?x:fa[x]
阅读全文
摘要: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>
阅读全文
摘要:http://codeforces.com/problemset/problem/50/C记录出轮廓线,计算出走的长度, ans+4View Code void get_data() { int64 i,j,k; for(i=0;i<N;i++) scanf("%I64d%I64d",&g[i].x,&g[i].y);}void solve() { int64 i,j,k,x,y,ans=0,cnt; cnt=graham(g,N,res); for(i=1;i<cnt;i++) { // printf("%d %d\n",r
阅读全文
摘要: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));}
阅读全文
摘要:View Code /*==================================================*\| Polya计数| c种颜色的珠子, 组成长为s的项链, 项链没有方向和起始位置;\*==================================================*/// 注意超long longint Polya(int c,int s) { int i,j,k,p[64], count; p[0]=1; // power of c for(k=1; k<=s ;k++) p[k]=p[k-1]*c; //reflecti...
阅读全文
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4801每个位置记录的是左边做靠近他的和他相同大小的id,线段树维护的是最大的id (id最大也即最早出现)View Code const int MM = 555555;#define debug puts("wrong")#define L(i) i<<1#define R(i) i<<1|1int N,M;int hash[MM];int num[MM];int val[MM<<2];map<int,int&g
阅读全文
摘要:容斥原理, 纠结好久, 求N以内和N不互质的所有数的和。http://acm.hdu.edu.cn/showproblem.php?pid=3501View Code int64 tp[MM], mm;void solve() { int64 i,j,k,ans=0,tmp=N,tt,t1,ret=1; for(i=mm=0;i<cnt;i++) { if(tmp%prm[i]==0) { tp[mm++]=prm[i]; while(tmp%prm[i]==0) tmp/=prm[i]; } } ...
阅读全文
摘要:View Code const int maxn = 11111; //文本最大长度int fail[maxn]; //失败了应该跳的位置char str[maxn], text[maxn]; //输入文本和待匹配的字符串//初始位置从0开始void get_next(int n) { int i, j=-1; for(fail[0]=-1, i=1;i < n; i++) { while(j>=0 && str[i]!=str[j+1]) j=fail[j]; if(str[j+1]==str[i]) j++; fail[...
阅读全文
摘要:模拟栈View Code const int MM = 555555;#define debug puts("wrong")int to[MM], cnt, ans;char str[MM], ch[MM];char st[MM]; int top;void solve() { int i,j,k, n=strlen(str+1), m=strlen(ch+1); ans=0; top=0; str[0]='#'; for(i=1;i<=m;i++) { if(ch[i]==str[n]) { for(j=n-1;j>0;j--) i...
阅读全文
摘要:View Code /*================================*\| 筛素数 [1..n]\*================================*/bool isp[MM]; int prm[MM];int get_prime(int n) { int i,j,k=0; int s, e=(int)(sqrt(0.0+n)+1); for(i=0;i<=n;i++) isp[i]=true; prm[k++]=2; isp[0]=isp[1]=false; for(i=4;i<n;i+=2) isp[i]=false; ...
阅读全文
摘要://组合数 com(n,r)View Code /*==========================*\| 组合数 com(n,r)\*==========================*/const int maxn = 100; //元素个数int com[maxn][maxn]; //注意 long longvoid get_com() { int i,j,k; for(i=0;i<maxn;i++) { com[i][0]=1; for(j=1;j<=i;j++) com[i][j]=com[i-1][j-1]+com[i-1][j]; ...
阅读全文
摘要:http://codeforces.com/problemset/problem/51/B利用stack类似与括号匹配,每个<table>ROWS</table> 划分一个模块,一个<td>TABLE</td>记录多少个CELL, stack中存的是模块的序号。View Code const int MM = 511111;const double esp=1e-8;const double lep=0.0000001;#define maxint 0x3f3f3f3ftypedef __int64 int64;#define debug put
阅读全文
摘要:http://codeforces.com/problemset/problem/51/C两次二分+贪心, 被卡精度卡了好久,发现整数点的话,结果不是整数就是 xxx.5的直接整数解决,就不会有精度问题啦。以后注意利用题目条件, double代码留作纪念。View Code const int MM = 511111;const double esp=1e-8;const double lep=0.0000001;#define debug puts("wrong")#define clr(a) memset(a,0,sizeof(a))int N,M,mm;int x[M
阅读全文
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5递归模拟, 记录pair<a,b>是否被访问过。View Code const int MM = 111111;#define debug puts("wrong")#define clr(a) memset(a,0,sizeof(a))bool vis[1005][1005];int op[MM];int Ca, Cb, N;bool ff;void gao(int x) { if(x==1) puts("fill A")
阅读全文
摘要:http://poj.org/problem?id=1699状态压缩,预处理出任意两个串的最长前缀和后缀的公共部分,然后DP。View Code //POJ1699const int MM = 110;#define maxint 0x3f3f3f3fint N;int d[1<<11][11];char str[MM];int len[MM][MM];int fail[MM];char ch[21][MM];int cal(int s1,int s2) { int i,j,k,n,m,ans=0; n=strlen(ch[s1]+1); m=strlen(ch[s2]+1)...
阅读全文
摘要:http://poj.org/problem?id=3368一维RMQView Code //询问递增序列 [l,r] 间,出现次数最多的数的个数,分段后用RMQ询问最小值int id, d[MM][17], N, Q;int len[MM],pos[MM],b[MM];int log_2(int x) { int res=0; while(x>>=1) res++; return res;}void get_rmq() { int i,j,k,limit; for(i=1;i<=id;i++) d[i][0]=len[i]; k=log_2(id); ...
阅读全文
摘要://phi[i]记录的是 0~i 之间与i互质的数的个数http://poj.org/problem?id=2478View Code const int MM = 1000005;typedef __int64 int64;int64 N;int64 phi[MM];void get_phi() { int64 i,j,k; for(i=1;i<MM;i++) phi[i]=i; for(i=2;i<MM;i+=2) phi[i]>>=1; for(i=3;i<MM;i++) { if(phi[i]==i) { for(...
阅读全文
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4778当存在一个sum+(s[N]-s[h-1])恒不大于M时return掉View Code const int MM = 111111;#define debug puts("wrong")typedef long long int64;int N,M,ans;int s[MM];int num[MM];bool cmp(int x,int y) {return x>y;}void get_data() { int i,j,k; s[0]=0;
阅读全文
摘要:View Code //头文件:#include <queue>struct Tpoint{ int val,dead; //Tpoint(int v,int d):val(v),dead(d) {} bool friend operator<(Tpoint x,Tpoint y) { if(x.val!=y.val) return x.val>y.val; else return x.dead>y.dead; }};//多个key,重载运算符,que.top()保存的是val最小的priority_queue<Tpoint>que;
阅读全文
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4778优先队列优化下的DP,dp[i]记录的是吃到i天的最小花费,最后dp[N]即为答案。View Code const int MM = 111111;#define debug puts("wrong")typedef long long int64;//typedef __int64 int64;int64 N, cnt;struct Info{int64 x,y;}p[MM];struct Tpoint{ int64 val,dead; //Tpo
阅读全文
摘要:http://poj.org/problem?id=2299View Code //POJ2299int f_min(int x,int y) {if(x<y)return x; else return y;}int f_max(int x,int y) {if(x<y)return y; else return x;}const int MM = 511111;typedef __int64 int64;#define maxint 0x3f3f3f3fint64 N;int64 num[MM];int64 L[MM], R[MM],ans;void get_data() { i
阅读全文
摘要:http://poj.org/problem?id=1753View Code struct GaussE { int a[MM][MM]; int x[MM]; // 解集 int equ, var; int free_x[MM]; // 记录不确定的变元. //初始化 GaussE(int e,int v):equ(e), var(v) {} void reset() { memset(a,0,sizeof(a)); memset(x,0,sizeof(x)); memset(free_x,0,sizeof...
阅读全文
摘要:View Code int gcd(int x,int y) { int tmp; while(y) { tmp=y; y=x%y; x=tmp; } return x;}int lcm(int a,int b) { return a/gcd(a,b)*b;}
阅读全文
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4969询问次数那么多,本能想到线段树。对区间重标号,区间询问, 更新。View Code int N,M,K, len;int ll[MM<<2], rr[MM<<2];int ff[MM<<2];int sum[MM<<2];vector<int>edge[MM];void dfs(int u) { int i,j,k,v; ll[u]=len++; for(i=0;i<edge[u].size();i++)
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2065矩阵乘法推出递推公式。View Code Matrix tmp(4,4);void get_init() { int i,j,k; for(i=0;i<4;i++) for(j=0;j<4;j++) tmp(i,j)=1; for(i=0;i<4;i++) tmp(i,i)=2, tmp(i,3-i)=0;}void solve() { int i,j,k; Matrix ans(1,4), tt=tmp; ans(0,0)=ans(0,3)=1; ans(0,...
阅读全文
摘要:View Code const int maxn = 22; //矩阵大小struct Matrix { int r, c; //矩阵大小 int a[maxn][maxn]; //初始化 Matrix(int r,int c):r(r), c(c) {} void reset() {memset(a,0,sizeof(a));} //重写(),方便存取 int& operator() (int i,int j) {return a[i][j];} //O(N^3) 矩阵乘法 Matrix operator*(const Matrix&B)...
阅读全文
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4973推出递推公式, 数据范围那么大, 矩阵乘法。View Code const int MM = 100011;const double eps = 1e-10;#define maxint 10000000#define mod 1000000007#define debug puts("wrong");//typedef __int64 int64;typedef long long int64;//const __int64 maxint = 10
阅读全文
摘要:http://acm.timus.ru/problem.aspx?space=1&num=1057View Code const int MM = 22222;int64 L, R, K, B, len;int64 C[33][33];int64 p[111];void get_p() { int64 i,j,k; p[0]=1; len=(int64)((log(1.0*R)/log(1.0*B))+1.0);// printf("%d\n",len); for(i=1;i<=len;i++) p[i]=p[i-1]*B;// for(i=0;i<=l
阅读全文
摘要:类似贪心。http://acm.nbu.edu.cn/v1.0/Problems/Problem.php?pid=2410View Code const int MM = 22222;int N,M;int cnt;int num[MM];struct Info { int val; int id; void reset() { val=maxint; id=-1; } bool friend operator<(Info x,Info y) { if(x.val!=y.val) return x.val<y.val; e...
阅读全文
摘要:Gao The Sequence计算出一个差值数组C[i], 一种操作, 找一个delate有C[i]-=delaie,找任意多个C[j]-=D[j] (j<i) 使sum(D[j])=delate, 问能否使C[i]全部赋0.View Code #include<cstdio>#define ll long longint main(){ int n; while(~scanf("%d",&n)){ ll a,b,c,s=0,m=0; while(n--){ scanf("%lld%lld",&a,&b); .
阅读全文
摘要:DFS的过程中引用一个指针对数组的引用是很不靠谱的, 以后要引用, 尽量传一个值, 类似于用结构体, 封装一个数组。http://acm.hdu.edu.cn/showproblem.php?pid=4536View Code const int MM = 22222;int N,M, Q;struct Info { int belong[22]; int val[22];}p;vector<int>B[MM];int ret,g;int a[5][MM];Info t;void get_data() { int i,j,k; scanf("%d%d%d",&a
阅读全文