- 博客(169)
- 收藏
- 关注
原创 数学专项counting:UVa 10128
设状态f[i][l][r]表示队中有i个人,从左往右看有l个人,从右往左看有r个人。此时要往i+1个人的队列的状态转移时,不妨设,新添的人是最矮的。那会有三种情况,要么添在最左,即f[i+1][l+1][r];要么添在最右,即f[i+1][l][r+1];要么添在中间,即f[i+1][l][r],此时会有i-1个位置可以放。这样既可递推出结果了。#include
2013-11-08 23:35:02
716
原创 数学专项counting:UVa 10237
先将棋盘染成2种颜色,可以发现可以将棋盘的格子分成2种互不相关的类型。每种类型按对角线长度的奇偶性分类,同一类型的行列不能出现多个bishop。为了递推,可以将所有行按升序排列。f1[i][j]表示对角线长度为奇数的第i行有j个bishop的方案数;f2[i][j]表示对角线长度为偶数的第i行有j个bishop的方案数。递推式为f[i][j]=f[i-1][j]+(c-j+1)*f[i
2013-11-08 23:27:18
831
原创 图论专项shortest_paths:UVa 10269
3维SPFA,注意状态转移的细节即可。#include #include #include #include #include using namespace std;const int maxn=110;const int maxe=10010;const int inf=1<<29;int head[maxn],nxt[maxe],cost[maxe],pnt[max
2013-11-08 23:11:35
691
原创 数学专项number_theory:UVa 10236
需要推之一个结论,即gcd(f[n],f[m])=f[gcd(n,m)],有了这个结论就可以做这题了。在递推fibonacci数列的时候需要一些小技巧。#include #include #include #include #include using namespace std;const int maxn=22010;const long double inf=1e9;
2013-11-08 23:06:56
614
原创 几何专项2D:POJ 2318
许久不做几何,完全不会了。刚开始O(n^2)纯暴力,妥妥地T了……其实只要利用叉积的性质,判断该点在隔板的左边还是右边,然后二分答案即可。#include #include #include using namespace std;const int maxn=5010;struct point{ int x,y; point(int x=0,int y=0):
2013-11-08 11:26:45
622
原创 几何模板总结(二):点在多边形内判定(转角法)
直接上模板吧,适用于任何类型的多边形(顺时针,逆时针,凹,凸)//p为点,poly为多边形int isinpoly(point p,vector poly){ int wn=0; int n=poly.size(); for(int i=0;i<n;i++) { if(onseg(p,poly[i],poly[(i+1)%n])) ret
2013-11-07 21:16:25
2317
原创 数学专项number_theory:LA 4382
利用wilson’s theorem可知所求的就是sum{[3*k+7为素数]|1#include #include #include using namespace std;const int maxn=5000010;int vis[maxn];int cnt[maxn];void init(){ memset(vis,0,sizeof(vis)); m
2013-10-28 16:40:06
633
原创 几何模板总结(一):二维基础
实数比较const double eps=1e-8;int dcmp(double x){ if(fabs(x)<eps) return 0; else return x<0?-1:1;}点和向量的定义struct point{ double x,y; point(double x=0,double y=0):x(x),y(y){}
2013-10-24 13:54:35
627
原创 字符串专项:CodeForces 235C
一道后缀自动机的算是模板题吧,可是我还是折腾了一个下午……总算对这个模板有了稍微深入的理解,debug了很久,也发现了不少的问题。现在算是基本会用后缀数组了。#include #include #include #include using namespace std;const int maxn=2000010;const int sigma=26;int n,sz;st
2013-10-24 10:31:06
682
原创 数学专项number_theory:LA 3521
就是要计算sum{k%i|1k的情况很容易处理。所以只要可以快速计算出sum{k%i|1#include #include #include #include #include using namespace std;typedef long long LL;LL n,k,m;int main(){ while(scanf("%lld%lld",&n,&k)!=E
2013-10-24 10:21:58
711
原创 字符串模板总结(五):后缀自动机
CLJ大神的后缀自动机,异常的强大,只不过也不太好理解。只能勉强把构造过程弄懂,其中很多性质还不是特别明白……char s[maxn]; //待构造字符串int sz; //状态个数struct state{ state *pre; //前继结点,表示最近的添完上一字符后的终止
2013-10-22 21:46:47
1101
原创 字符串模板总结(四):后缀数组
后缀数组是处理字符串问题常用的工具之一,只不过我当时学的时候不求甚解,所以对于其中实现的计数排序,不是特别的懂,只会逃一个模板,把后缀数组sa求出来。int s[maxn]; //待构造字符串int sa[maxn]; //后缀数组int t[maxn],t2[maxn],c[maxn]; //辅助数组//每个
2013-10-22 15:48:14
687
原创 数学专项number_theory:LA 3262
题意就是找出n(1这里需要自己手写一个高精度类以比较大数,先枚举一个数的情况,若不存在,再枚举二个数的情况即可。#include #include #include #include using namespace std;const int maxn=66000;struct bign{ int len,s[maxn]; bign(){memset(s,
2013-10-22 12:25:41
508
原创 字符串专项:LA 3490
先对原串做一遍kmp,然后对每个结点,建立状态转移矩阵,然后做高斯消元即可得到结果。注意这里不可以用实数运算,否则会因掉精度而WA,所以需要避免实数运算。#include #include #include #include using namespace std;const int maxn=20;typedef long long matrix[maxn][maxn];i
2013-10-19 23:18:06
637
原创 搜索专项:LA 3667
可以将需要丈量的状态进行hash,然后进行bfs,这里状态的设计和枚举需要注意。#include #include #include #include #include using namespace std;const int maxn=60;struct node{ int sz; int st; int r[10];};int n;int
2013-10-19 23:09:17
669
原创 数学专项counting:UVa 11481
题目大意就是求N个数的排列中有多少个前M个数恰有M-K个错牌。这里可以先从前M个数中选K个数不变,即C(M,K)种。然后问题就转化为求n个数前m个数错排的排列数。递推方程为:f[i][j]=(i-j)*f[i-1][j-1]+(j-1)*f[i-1][j-2];边界条件为:f[i][0]=i!。#include #include #include using namespac
2013-10-16 23:12:13
587
原创 字符串模板总结(三):KMP
KMP的重要性无需多言计算失配函数int f[maxn];void getfail(char* P){ int m=strlen(P); f[0]=0;f[1]=0; for(int i=1;i<m;i++) { int j=f[i]; while(j && P[i]!=P[j]) j=f[j]; f[
2013-10-15 16:06:52
482
原创 数学专项counting:LA 4064
即求平面上n个点共能构成多少个锐角三角形和直角三角形。我的方法是先统计钝角的总数,然后用C(n,3)减去即可。钝角统计的方法:枚举原点,将剩下的点级角排序,然后二根扫描线扫,即可统计钝角个数。这里需要注意精度问题。#include #include #include #include #include using namespace std;const int maxn=250
2013-10-08 23:36:45
667
原创 数学专项counting:UVa 11529
问题实质上是求平面上的n个点一共可以构成多少个凹四边形,方法就是先选定一个点作为原点,然后将剩下的点级角排序,然后扫一遍,统计在原点的一侧共能形成多少个三角形,即凹四边形的个数。累加即为最终的结果。#include #include #include #include #include using namespace std;typedef long long LL;cons
2013-10-08 23:26:22
505
原创 字符串模板总结(二):字符串哈希
字符串哈希代码简单,思想也很好理解,在处理一些字符串问题时,非常之有效。其精髓就是一个在unsigned long long范围内的哈希函数typedef unsigned long long ULL;const int maxn=10000;const int x=123; //hash函数的参数ULL H[maxn]; //字符串hash值
2013-10-04 16:50:49
576
原创 字符串模板总结(一):AC自动机
AC自动机主要解决多模式串匹配的问题,与dp有较多的结合。AC自动机本质是在tire树上建立如同kmp一样的失配边。所以建AC自动机首先要将模式串建成一颗tire树。//tire树const int maxn=100010;//最大结点总数const int sigma=26; //字符集大小,即字符值必须为0~sigma-1int ch[maxn][sigma]; /
2013-10-01 19:35:53
555
原创 数学专项counting:LA 3295
就是分类统计,分3类。第一种是一条水平的或竖直的边,数目为所有对角线条数的两倍;第二种是有一条水平的边和一条竖直的边,数目为所有对角线条数的(2*n+2*m-4)倍;第三类是3条边均不是水平或竖直的,先从n+1条水平边中任取3条,即C(n+1,3),再在m+1条竖直边取3条边的排列,即P(m+1,3),利用乘法原则,总数为C(n+1,3)* P(m+1,3),但此处多算了3点共线的情况,只要在计算
2013-09-18 22:59:08
785
原创 数学专项counting:LA 3720
这道题的关键是枚举对角线的斜率,当枚举的矩形的长宽互质时,则该斜率第一次出现,将所有满足该长宽的对角线加上。这样,这些矩形的长宽的2倍的矩形被重复计算了一次,所以当长宽的gcd为2时,要将其扣除。这样,即得结果。#include #include #include #include using namespace std;typedef long long LL;const i
2013-09-18 22:43:58
879
原创 动态规划专项advanced:LA 4625
这道题要求解的问题是使最大值最小的问题,所以可以加一个参数加以限制,然后判断是否可行用二分的方法求解答案。这里二分每个half-segment上的最大重量,然后剩下来需要做的就是判断是否存在一个方案满足该条件。容易想到的是贪心,即每一段取尽量多的pieces,看m-1段能否将pieces全部取完,然而这个贪心是错的。看这样一个例子:n=8,m=4,d=10,w[]={7,7,1,1,5,5
2013-08-19 00:32:57
662
原创 图论专项shortest_paths:UVa 658
bug的每个状态为一个点,以pitch为边建图跑最短路即可,只不过这题点数很大,差不多一百万个点,所以SPFA有点慢,我跑了2.2s才过……#include #include #include #include using namespace std;const int maxn=30;const int maxm=110;const int inf=1<<30;int n,m
2013-08-16 23:38:13
567
原创 关于max和min函数的优化:codeforces 333D
就是用二进制运算来写int fastMax(int x, int y) { return (((y-x)>>(32-1))&(x^y))^y; }int fastMin(int x, int y) { return (((y-x)>>(32-1))&(x^y))^x; }codeforces这题就卡这个,把库函数改成这个就可以过。#include #include using n
2013-08-14 16:40:47
1839
原创 库函数bitset的应用:codeforces 333E
bitset 可以用来方便的表示一个二进制串,并进行相关的操作。感觉在hash,表示集合的时候非常方便并且高效。定义:bitset set_name(inital_value)具体操作:这道题算是一个应用的例子吧,大意是在n个点中取3个点使其两两间距离的最小值最大。这里可以将点两两间的距离排序,然后从最大的边开始加,直到出现一个三角型为止,这里需要用到bitset来验证每
2013-08-14 16:35:00
896
原创 多校第5、6场总结
第五场HIT出的确实有些搓,参考价值不大只不过这一场我又被一道简单dp给坑了……8炮才过连续两场出现这样的情况真心动摇了我在dp上的信心,所以我决定这段时间还是需要刷一下dp,题目来源就暂定为训练指南上推荐的advanced的dp题,毕竟dp是区域赛里最为常见的一种类型,而且十分考验思维,多练练,有益无害。第六场sevenkplus大牛的题思维层次显然就高了许多……除了签到
2013-08-08 23:53:41
558
原创 图论专项shortest_paths:UVa 11280
增加一维记录走过的步数进行SPFA即可,最后注意从小到大更新结果。#include #include #include #include #include #include #include using namespace std;typedef pair pii;const int maxn=110;const int maxm=2000;const int inf=1
2013-08-07 23:37:34
667
原创 图论专项shortest_paths:UVa 10246
最短路变形,枚举所有点进行最短路,同时最短路上不能存在比该点权值大的点,查询时结果即为min{d[i][s]+d[i][t]+w[i]}。#include #include #include #include #include #include using namespace std;const int maxn=100;const int maxm=3000;const i
2013-08-07 23:32:51
643
原创 数学专项matrix:UVa 11551
快速幂模板题。#include #include #include using namespace std;const int maxn=60;const int mod=1000;typedef int matrix[maxn][maxn];int a[maxn],b[maxn];int n,r;void mat_mul(matrix A,matrix B,matrix r
2013-08-07 23:21:10
870
原创 动态规划专项advanced:LA 4394
关键是贪心出一个性质,即每次刷一个串,都可以从头开始刷起,如果第一个字符相同,则从第二个开始刷,而每次刷要么只刷一个字符,要么刷到另一个与目标串首字符相同的字符为止。只要发现了上述性质,转移就不难写了。我写的是3维的dp[L][R][C],L、R表示待刷的字符串的区间,C表示该字符串的状态,如果C为0则表示该串未被刷,而当1状态转移方程为dp[L][R][C]=min{1+dp[L
2013-08-06 23:12:55
1233
原创 数学专项matrix:LA 2561
显然可以以30个按钮是否按下为变量列出30个在模2剩余系下的方程,然后进行高斯消元即可,因为是在模2剩余下,所以加减操作都可以通过异或来完成。#include #include #include #include using namespace std;typedef int matrix[35][35];int dx[]={1,-1,0,0},dy[]={0,0,1,-1};m
2013-08-05 23:46:31
627
原创 数学专项matrix:UVa 10689
快速幂模板题。#include #include #include using namespace std;typedef int matrix[3][3];int mod;int a,b,n,m;void mat_mul(matrix A,matrix B,matrix res){ matrix C; memset(C,0,sizeof(C)); fo
2013-08-05 23:38:59
633
原创 数学专项matrix:UVa 10655
递推式显然f[n]=p*f[n-1]-q*f[n-2],直接快速幂即可,只不过这题输入有坑。#include #include #include using namespace std;typedef long long LL;typedef LL matrix[3][3];LL p,q;int n;void mat_mul(matrix A,matrix B,matrix r
2013-08-04 23:56:56
697
原创 数学专项matrix:UVa 11149
典型的倍增法的应用,这里我用了递归的方式实现,这样比较直观,也比较好写(主要是因为迭代写的一直WA),注意输入的时候需要取模。#include #include #include using namespace std;const int maxn=50;typedef int matrix[maxn][maxn];int n,K;void print_matrix(matrix
2013-08-04 23:51:06
613
原创 后缀自动机刷题小结
鉴于被最近CLJ大神出的多校赛虐的体无完肤后,决心怒学神奇的后缀自动机。第一遍看CLJ大神的ppt后完全就是晕头转向。然后我看了一个OIer的blog,算是大概明白了后缀自动机的构造过程,理解了之后发现代码还是比较容易写的,基本不需要模板。之后就是刷题了……可是以刷题就发现各种不会做……仲么破!!!各种借鉴之后,才把几道算是模板的题都刷完了,还需要再深入理解啊,关于性质的证明完全木
2013-08-04 21:47:50
1807
原创 搜索相关刷题小结
最近下了99-09年的OI国家集训队论文,然后一直在翻搜索相关的论文。然后跟着论文稍稍刷了下题,发现其中有些例题,尽管看了论文,还是做不出来,实在是弱爆了……至于神马心得之类的,论文里都总结的很清楚,这里我也就不班门弄斧,画蛇添足了。这里就列几篇我认为对我比较有帮助的论文吧,1.黄晓愉《信息学竞赛中搜索问题的常见优化技巧》算是入门吧,推荐的题也相对基础。2.汪汀《参数搜索的应用
2013-08-03 12:27:32
824
原创 多校赛第三,第四场总结
第三场说多了都是泪,被CLJ大神虐的妥妥的……结果只出了2题,痛定思痛,绝对怒学suffix automation以秒杀众多字符串题!第四场么……结果秒强还可以,出了5题。只不过这场我打的有一些搓……第一道简单dp纠结了很久也没有做出来,然后最后还剩一个小时的时候打03那道搜索被一个trick坑到了,结果最终一直TLE……总的来说,问题主要还是集中在是否可以做出一道突破密集区的题,
2013-08-03 10:57:23
615
原创 多校赛第二场比赛总结
第一场多校赛因为是自己学校出题,也不计排名,所以也就没写总结。这里顺便总结一下,那场我过了2题,一道找规律的数学题,一道变形的LIS,然后敲了occupy city的几何部分,可是因为队友图论的问题没过。还有就是在一道不可做题上浪费了太多不必要的时间,还有数据结构是弱项,一道可做的数据结构题,没有做出来。最终过了4题,排名55,可以说尚可。今天就比较惨了,3个半小时的时候过了第3题后就再也
2013-07-25 23:04:15
626
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人