- 博客(109)
- 收藏
- 关注
原创 表达式求值
#include#include#include#include#include#includeusing namespace std;templateclass expCal{ public: expCal(){ expMid.clear();expSuffix.clear();} expCal(string s){ expCal();
2013-10-06 18:10:55
784
原创 hdu 4686 (等比解法)
这题的正解是矩阵快速幂,但是在比赛的时候没有构造出矩阵,然后直接用数学的方法把这题ac了,方法如下:可以得出an和bn都是类等比数列,类等比数列暂且定义为等比数列之间的加减乘除组合后的数列,an,bn如下:an=A0*Ax^n+Ay*(Ax^(n-1)+Ax^(n-2)+......+Ax^1+Ax^0).(n>=1)bn=B0*Bx^n+By*(Bx^(n-1)+Bx^(n-
2013-08-22 12:53:38
845
原创 hdu 4680(splay tree)
解题思路: 第一种操作,用小集合暴力插入到大集合,可以证明总的时间复杂度O(n*logn); 第二种和第三种操作,每次操作O(logn) 第四种操作,因为任意3个数不能组成一个三角型,则就是长边大于剩下的两边之和,和斐波那契数列类似, 所以对于10^9的数据范围来说只有几十个,用贪心的思路,从最小的开始,暴力二分查找即可。 第五种操作,因为一个区间的gcd值
2013-08-17 19:29:24
1048
原创 hdu 4667(几何)
解题思路:求出所有可能在外围的点。也就是将两圆两两求外公切线,得到所有的切点;将圆和三角形的三个点依次做切线,也得到切点,再加上所有三角形的三个点。最后对这些点求凸包,对于凸包上的每条边,如果它们在同一个圆上,用相应的圆弧替代。#include#include#include#include#include#include#include#include#inclu
2013-08-15 13:15:39
1132
原创 hdu 3547(Polya计数)
//根据Polya计数的原理,我们先要求出每个置换群中的循环的个数//这里有24个置换群,为什么是24个了,很容易想到,把每一个面当作正面并按一个方向(顺时针或逆时针)旋转4次,总共6个面,所以就是24个置换群了;//我们可以先对立方体的8个顶点编号,然后就可以暴力预处理出24置换群的循环个数了,最后就是用Polya的计数公式计数了,代码如下:#include#include
2013-08-13 13:20:34
832
原创 自己实现用FFT加速多项式计算
/* * FFT之所以能加速DFT的计算,得益于n次单位复数根的几个性质: * 1.消去引理 w(d*n,d*k)=w(n,k); * 1.折半引理 w(n,k)^2=w(n/2,k); * 2.求和引理,即:sum{w(n,k)^j}=0 (0 * 详见:算法导论第30章,p527~p535*/#include#include#include#include
2013-08-12 14:45:42
1670
原创 hdu 4622(后缀自动机|后缀数组)
//昨天晚上一直用后缀数组来写,怎么写都超时,今天看了多校3的官方解题,然来是卡常数;//今天上午就去学习了缀自动机(以前没有主动去学后缀自动机,以为后缀自动机能解的,后缀数组都能解,这次尝到了苦头);//这题官方解题说可以O(n^2)+O(1),可是我写的后缀自动机时间复杂度还是O(n*q),因为每次计算字串的个数的还是把所有的step遍历了的一遍,但是没事重新建树,建树的常数小了一些;
2013-07-31 16:37:03
1930
4
转载 zoj 题型分类
简单题#1001 -____-b A+B。#1110 Dick and Jane 胡乱枚举收缩一下情况就可以了。#1115 a[i+1] = a[i] 的全部数位上的加起来,直到剩下一个,直接模拟。#1414 太弱太弱,按照模 4 分类讨论一下即可。#1713 简单的字符串截取和字符计数。#1716 简单的二维数组区间求和,作累加,然后容斥一下;预处理 O(W*H),查询
2013-07-26 10:17:58
2234
原创 图论知识点记录
//此知识点记录一下学习的思路:比较经典的题目了,首先按照边权分离边,从小到大添加进树中,可以知道相同边权的边形成的联通分支是一样的,所以在上一次操作存留下来的图中对每种边权先求一次生成树,记录哪些联通分支被连起来了,再按照这些联通分支进行构图,求这个图中不同的生成树的个数,这一步按照Kirchhoff定理求幺模矩阵的秩就可以了原博客:http://hi.b
2013-07-23 11:30:49
884
原创 hdu 湫秋系列故事——安排座位(组合dp)
/* * 以前比赛的时候做这题,一点思路都没有,后面就放了放; * * 今天突然想来弄下这题,于是去拜访了大牛的博客,了解到了组合dp的解法 * * 解法如下: 首先我们令F[i][j]表示前i个系的所有学生坐在座位上,出现了j对相邻学生是同一个系的 * * 那么对于接下来一个系的a个学生,我们可以把这个系的学生插入前面出现的j对相邻学生的中间,从而使他们变得不相
2013-07-22 16:29:15
1135
原创 hdu 3939 (Sticks and Right Triangle)
//数论(勾股数组相关),在acdream 群里看到的实现代码如下:#include#include#include#includeusing namespace std;vector fac[1000001];int prime[100000],phi[1000001],m;void init(){ //预处理phi[] int i,j; m=0
2013-07-22 13:29:06
927
原创 几何代码总结
struct Point{ int x,y; Point(int a=0,int b=0):x(a),y(b){}};Point operator-(Point a,Point b){ return Point(a.x-b.x,a.y-b.y); }Point operator+(Point a,Point b){ return Point(a.x+b.x,a.y+b.y)
2013-07-12 20:21:26
1040
原创 zoj 1030 (dfs+几何)
//从每一个点开始,向某一个几何方向dfs搜索几何圈,然后判断几何圈里有没有其他的点,再把几何圈去重就是答案,O(n^3).#include#include#include#include#include#includeusing namespace std;struct Point{ int x,y; Point(int a=0,int b=0):x(a),
2013-07-12 20:04:15
942
原创 hdu 1625(flyd判正环)
//自己能到自己,则表示这个点在环上;#include#include#includeusing namespace std;int mat[31][31],n,m;int main(){ int a,b,i,j,k,cas=0; while(scanf("%d",&m)!=EOF) { memset(mat,0,sizeof(ma
2013-07-11 21:05:23
897
原创 hdu 3666 THE MATRIX PROBLEM(判负环)
解题思路:(U,L,mat[i][j])>0;因为题目要判定 L因为减号具有传递性(比如a-b=5,b-c=5由传递性得a-c=10),因为图即具有传递性(可以求出一颗最短路径树的图),又具有矛盾性(负环,下面会详细介绍),我们就可以把它抽象成图来判定判定负环log(ai)-log(bj)log(L/mat[i][j])=-log(U/mat[i][j]);如果
2013-07-10 19:29:28
774
原创 CodeforcesRound#191(Div.2)
A题:直接枚举#include#includeint A[110],c[110];int main(){ int n,i,j,ans,sum,x; while(scanf("%d",&n)!=EOF){ sum=x=0; memset(c,0,sizeof(c)); for(i=1;i<=n;i++) scanf("%d",&A[i]); f
2013-07-05 11:10:00
890
转载 ACM-ICPC 2013 World Finals 简单题解
原博客地址:http://jiazhipeng.byethost7.com/archives/268
2013-07-04 23:23:20
2048
原创 hdu 4328 (悬线法+dp)
悬线法用于求解最大子矩阵问题,资料详见:这篇论文对于red-and-blue crisscross 方阵可以用dp,既可以用合并两个小方阵得到一个大方阵,合并过程如下图: 我们可以把两个绿色的3*3小方阵合成一个4*4大方阵,只要符合color[i][j]!=color[i-1][j]&&color[i][j]!=color[i][j-1]&&color[i][j]==color[
2013-07-02 14:10:46
978
原创 hdu 4483(数论)
/* 这是一个经典的题目,以前遇到n范围都比较就小,可以直接枚举每一个长方形的两个对角点,最后答案就是 C(n*n,3)-2*n*C(n,3)-2*sum{sum{(n+1-i)*(n+1-j)*(gcd(i,j)-1)}}(1 然而这题的n范围比较大,直接枚举肯定不行,但是我们可以优化上面的这个公式; 第一次看到这题的时候,不会优化,到后面我做了下uva1
2013-06-30 23:06:18
973
原创 2sat 题目练习
2sat 问题的练习这个博客收集很多:http://www.cnblogs.com/ambition/archive/2011/07/30/2-sat.html hdu 3062:裸的,(基本的2选一,限制的2选1,如果能在限制的条件下实现基本的2选1表示题目有解),代码如下:#include#includestruct E{ int t,next;}edge
2013-06-30 14:48:57
791
原创 ZOJ 3717 Balloon (2sat+二分)
这题是一个二分半径+判定的题,但是开始不知道怎么去判定,以前听别人提起过sat问题,感觉这题是一个2sat模型,因为有一些限制比如:同一组两个里面只能选一个,两个球重叠时只能选其中的一个等,这很符合2sat的模型,于是去翻了下白书上2sat问题的解法实现,建图后直接用搜索判定,我用这种方法写了写,开始提交wa了几次,wa的原因是:题目说在round之后也要保证不重叠,那就只有舍掉小数点3位以后的数
2013-06-30 13:45:33
1538
原创 Codeforces Round #190 (Div. 2)
A题:直接输出就好了,除了最后一个人不能跳外,其他的每个人first time dancing一次,总共可以跳 n+m-1次,代码如下:#include#includeint main(){ int n,m,i; while(scanf("%d%d",&n,&m)!=EOF) { printf("%d\n",m+n-1); for
2013-06-29 19:16:45
804
原创 函数式线段树(主席树)学习实践spoj10628
//count the tree/*思路:每个点建立一颗线段树(增量建立),以遍历的时间为序,充分利用上一颗线段树的信息,在这题上一颗线段树就是父节点的线段树,因为我们每次更新的信息只有一个节点,一个节点被更新了,那么它的所有祖先节点也要相应的被更新,又因为在线段树中一个节点的祖先节点数不会超过(logN)个,所以这颗线段树和上一颗线段树大部分节点是一样的,只有刚刚说的logN个节点被改变
2013-06-04 21:40:30
1186
原创 以前写的AVL树实现map练习
AVL树的资料见这:http://blog.youkuaiyun.com/laziercs/article/details/8280074实现代码(范型模版实现方式,若有不妥的地方,请大家广言):#include#include#includetemplate struct Type{ Tk key; Tv val;};template Type makepair(T
2013-06-04 19:38:31
1138
原创 2013金山西山居初赛第一场(hdu4545-hdu4547)
A题:用短串去长串里里面找自己(找的时候把字符转换一起考虑),找到就是happy;代码:#include#includeint mat[30][30];char s[1100],str[1200],a[3],b[3];int main(){ int cas,m,i,cass; scanf("%d",&cass); for(cas=1;cas<
2013-05-17 22:17:00
960
原创 hdu 4486 Pen Counts
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4486 题目大意: 把一个长度为n的绳子分成三段,用这3段绳子组成三角形,问有多少个不同的三角形 如果一个三角形的三边都不相等,可以算两次,其它的情况算一次; 解题思路: 假设一个三角形的三条边长为a,b,c,且a 这样我们可以枚举三角形的a边,再求在a边确定情况
2013-05-05 22:03:51
1176
1
原创 xmu网宿科技杯 厦门大学第四届程序设计积分赛 第四场
A题:题目链接:http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1465 题目描述: 将含有n个整数的数列A中的所有整数重新从小到大排序以后得到的新的数列B, 满足, 对于任意正整数i, j(1 个整数列C, 你需要求出将其变为连续数列所需花费的最小代价和。(将整数x变为整数 y需要花费|x - y|的代价, 所
2013-05-05 21:26:19
2529
原创 第十一届北京师范大学程序设计竞赛解题报告
A题:模拟#include#include#include#include#includeusing namespace std;int main(){ int i,n,cas; vector month[15]; month[11].push_back("Basic Training"); month[12].push_back("Basic
2013-04-30 21:42:38
1110
原创 2013 福州大学第十届程序设计竞赛
A题:中学物理题,直接求就好了;#include#includeint main(){ __int64 cas,s,h,vx,vy; scanf("%I64d",&cas); while(cas--) { scanf("%I64d%I64d%I64d%I64d",&s,&h,&vx,&vy); vx=s
2013-04-29 22:12:40
1543
原创 自己写的splay模板
#include#include#includeusing namespace std;#define N 300010const int INF=1<<30;int tree[N][2],pa[N],cnt[N],rev[N],val[N];int Max(int a,int b){ return a>b?a:b; }class splaytree{ public: i
2013-04-28 09:26:05
843
原创 DLX 模板
//以hust1017为例#include#include#define N 1100#define M 1100#define V N*M#define INF 100000000int D[V+1],U[V+1],L[V+1],R[V+1],C[V+1],mark[V+1];int S[M+1],H[N+1];void remove(int c){ int i,j
2013-04-18 21:52:40
813
转载 最小 k 度限制生成树
原文地址:http://blog.163.com/surgy_han/blog/static/2079912702012112884113774/所谓最小 k 度限制生成树,就是指有特殊的某一点的度不能超过k时的最小生成树。简单思想:设特殊的那点为v0,先把v0,删除,求出剩下连通图的所有最小生成树,假如有m棵最小生成树,那么这些生成树必定要跟v0点相连,也就是说这棵生成树的v0点
2013-04-06 09:58:42
969
原创 ZOJ3690Choosing number
/*题目:Choosing number题目连接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3690题目大意:n个人站成一行,这儿有m个数字,1,2...m,每个人选择一个数字,但是如果相邻的两个人选择了同一个数字这个数字不能超过k,请问他们有多少种选择数字的方式? 解题思
2013-04-02 20:00:11
800
原创 ZOJ 3691 Flower
/*题目: Flower题目连接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4974题目大意: 三维空间中有n个点,序号为1-n,每个点有一个坐标,每个点上有F[i]朵花,每个点只允许L[i]朵花从这个点转移出到别的点,每两个点之间的距离为欧几里得距离,现在Gao的女朋友要把序号2-n点
2013-04-02 19:13:05
1223
原创 hdu4533-威威猫系列故事——晒被子
/*把(0,0),(t,t)看成是一个大矩形的话,那么这个大矩形的右上坐标x是等于y的,有了这个就好办了,我们可以维持一颗关于t的线段树,比如现在对一个X矩形(x1,y1),(x2,y2)来说如果t>=Max(x2,y2),那么这个面积直接加上;在关于t的这颗线段树上操作也就是相当于更新(Max(x2,y2)~Max(t))这个区间,而对于(0~MAx(x1,y1))这个区间是无影响的
2013-03-29 21:54:29
3583
转载 左偏树的讲解
//本文转自:这里2.1.2 可并堆的定义可并堆(Mergeable Heap)也是一种抽象数据类型,它除了支持优先队列的三个基本操作(Insert, Minimum, Delete-Min),还支持一个额外的操作——合并操作:H ← Merge(H1,H2)Merge( ) 构造并返回一个包含H1和H2所有元素的新堆H。 O(n),用它来实现可
2013-03-27 17:20:05
1276
转载 base64 编码解码(来自我同学)
base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于26=64,所以每6位为一个单位,对应某个可打印字符。三个字节共24位,对应于4个base64单位,即3个字节需要用4个可打印字符来表示。它常用来作为电子邮件的传输编码。在base64中的可打印字符包括大写英文字母A-Z,小写英文字母a-z、阿拉伯数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同,通常用加号
2013-03-25 12:11:01
1423
原创 矩阵快速幂
void mult(int a[2][2],int b[2][2]){ int i,j,k,c[2][2]={0,0,0,0}; for(i=0;i<2;i++) for(j=0;j<2;j++) for(k=0;k<2;k++) c[i][j]=(c[i][j]+(a[i][k]*b[k][j])%mod)%mod; for(i=0;i<2;i++)for(j=0;j<
2013-03-23 23:03:41
698
原创 hdu 3308 LCIS
/*题型:线段树;解题思路: 在线段树的节点上保存lmax,rmax,max三个值,lmax表示从该节点左端点数递增的最长长度,rmax表示终点是该节点的右端点的最长长度,max表示该区间的最长长度更新就是:如果左孩子的右端点小于右孩子的左端点,那么就合并左孩子rmax和右孩子的lmax;查询时和更新相似; 代码如下:*/ #include#inclu
2013-03-17 18:05:29
620
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人