- 博客(108)
- 收藏
- 关注
原创 ural 1682
从1写到无穷,每写1个数可以和前面的数连边,连边有两个条件a + b ^ 2 == 0 mod k || b + a ^ 2 == 0 mod ks
2014-08-12 20:41:56
603
原创 poj1182和ural1003
poj1182并查集的运用,集合之间的关系表示,增加一个字段来表示和跟的关系r[x]如果r[x] == 0表示和根同类,r[x] == 1表示根吃x,r[x] == 2表示x吃根。那么现在如果x,y的关系为r[y],y,z的关系为r[z],那么x和z的关系则是(r[y] + r[z]) % 3。不妨画个图看看。现在读入一个陈述:1.如果x,y在同一个集合里面:1. 1 x
2014-06-28 00:18:21
569
原创 第4章:文件和目录
stat,fstat,lstat分别获取不同文件的stat结构信息文件类型有7种:(1)普通文件(2)目录文件(3)块设备(4)字符设备(5)Socket(6)FIFO(7)符号链接设置用户ID和设置组ID通常一个进程的有效用户ID和有效用户ID为实际用户ID和实际组ID,但是如果一个进程设置了设置用户ID,那么有效用户ID为文件所有者ID,有效组ID为文件组ID
2014-04-22 11:27:52
619
原创 codeforces round #230
codeforces_div230A:半径为n的圆,园内有一些整点,和它距离为1的点就连接起来,现在去掉一些点,使得圆内的点和圆外的点没有连接。策略是选择圆内的点:圆内选择肯定是靠近边界的点,如何选择?四个端点肯定是要选择的。(n, 0) (0, n) (0, -n), (-n, 0)四个点。然后圆内的点,因为象限对称,只要考虑第一象限,如果横坐标为1,可以算出一个圆内的纵坐标
2014-02-21 10:25:01
629
原创 codeforces_374c
在一个二维表中搜特定序列的串。采用记忆化的搜索。dp[x][y]表示x,y能达到的最大深度,如果每次搜的时候能搜到原来的点,那么就是无穷的。如果dp[x][y]的深度大于4,说明是存在特定串的。AC代码:#include #include #include using namespace std;#define max(a,b) ((a) > (b)) ? (a) : (b
2013-12-19 20:09:40
528
原创 编译器开发(一)
好吧。在学习完编译原理之后终于自己做了一个编译器的前端。当然只是一个很简单的前端。会在接下来的日子里面去不断完善这个编译器前端,以后再写出一个后端出来。前端分为词法分析,语法分析和语义分析。语法的结构如下:程序>::= main()语句块>语句块>::= ‘{‘语句串>’}’语句串>::=语句>{;语句>};语句>::=赋值语句>|条件语句>|循环语句>赋值
2013-12-18 23:00:18
929
原创 codeforce round #217
A题:rook的话如果同行同列就一次,否则两次。bishop,首先如果一个在白色位置,另外一个在黑色位置是不可达的。否则再一条对角线上就一次,其余位置两次。king,bfs()一次求出答案。AC代码:#include #include const int MAX_NUMBER = 1007;struct Point { int x, y, steps;
2013-12-07 20:59:42
543
原创 codeforces 367C
有n个位置,有m个不同的数,选数的代价为mi,选出k个数,填在n个位置中,使得所有k个数中任意选两个都是相邻的。类似于相邻位置满足的关系可以用一条边来表示。选k个数,因为任意两个都要相邻,填在n个位置后,相当于所有边都要经过一次,那么就是形成一个欧拉路,且任意两个位置都要相邻,至少要有k * (k - 1) / 2条边。如果k是奇数的话,那么k * (k - 1) / 2条边足以形成一
2013-12-05 20:06:56
1005
原创 usaco_3.2.2
求满足条件,且排列序为I的串。有两种方式求,一是求出不满足条件的串,而所有串易求,不满足的也容易求,把不满足条件的串再I序前面的求出来,求出I的正常序。2是直接统计满足条件按的串。此题应为2的做法,因为不满足条件的串的求法和满足条件的串求法对称,也比较难求。用dp[i][j]表示长度为i,1的个数不超过j的满足条件的串的个数。那么dp[i][j] = dp[i - 1][j]
2013-12-02 16:36:41
610
原创 poj1659
havel可图定理。如果有一个图的度为d1,d2...dn。那么依次将图度从大到小排序,先满足最大小的和次大点的连接。每连接一次扔掉最大点,然后继续排序,如果排序过程中没有点的度数为负数,说明是可图的,否则不可图AC代码:#include #include #include using namespace std;const int MAX_NUMBER = 2
2013-11-05 19:07:39
1405
原创 codeforces round 209
A:水直接观察得到只有两种情况,要么2次,要么4次,如果边界上有1则为2次,否则为4次AC代码:#include #include const int MAX_NUMBER = 55;int maps[MAX_NUMBER][MAX_NUMBER];int n, m;int main() { scanf("%d%d", &n, &m); int
2013-11-05 11:37:14
567
原创 hdu3415
求最大的连续不超过k的子序列的和。用单调队列维护。先求出s[1..i]的和,将前k个添加到n的结尾就相当于有循环和了。那么对于某个sj,他的最大的序列和为s[j] - s[i],其中 j - k - 1 那么用单调队列去维护i,可以在O(1)的时间去求出s[i]。今后有任何优化问题需要减去前面最小或者加上最大和的都可以使用单调队列去维护。AC代码:#include
2013-11-05 11:22:31
1135
原创 usaco_3.1.6
简单dp = =,没想出来。。一开始想到用dp[i][j] = 1来表示可以用j张邮票来找i钱。。转移方程为dp[i][j] = 1 if dp[i - coin[k]][j - 1] = 1。后面发现内存太大存不下。后面发现dp[i][j]只和dp[i - coin[k][j - 1]有关,于是准备用滚动数组去做。做不出来= =。。看了题解才知道可以用另外一种表示方法dp[i]表示
2013-10-27 11:02:12
544
原创 codeforces_351b
好吧。。比赛的时候没有做出来。主要是只考虑了所有整数都取向下的情景,没有考虑到所有整数都往上取。首先区分出整数和小数,整数的差是没有影响的,主要在于小数的差。先把所有小数的和求出来。因为取上为n个,取下为n个。对于所有小数来说哪一个小数取上和哪一个小数取下是没有区别的。假设0.3 0.5 0.7 0.8 ...假设里面有2个可以取上,2个可以取下。无论是哪2个取上取下最后一定是0
2013-10-05 23:54:31
789
原创 codeforces_350b
求到宾馆的最长路。开始想法是添加超级起点和终点,起点向所有山连接一条权为0的边,所有宾馆向终点连接一条权为1的边。然后只有出度为1的点才可以对后面进行更新(超级起点不算),做一遍spfa最长路,然后输出路径。不知道为什么会TLE = =然后重新想可能枚举所有起点,然后求当前起点的最长路。发现好麻烦。因为一个点有多条出的路径。dfs时间复杂度也太高。没有想到反过来做。。枚举所有终
2013-10-02 15:37:38
1311
原创 usaco_1.4.3
做的时候只知道把表打出来,不知道怎么去找等差数列。做法直接枚举公差和首项即可。AC代码:/*ID: 123PROG: ariprogLANG: C++*/#include #include const int MAX_NUMBER = 250 * 250 * 2 + 3;bool vis[MAX_NUMBER];int n, m;void ini
2013-09-28 20:38:19
662
原创 codeforces_346a
从一个集合里面选两个数,x,y 把|x - y|的绝对值加进去,如果|x-y|的绝对值不能被加进去的话那个人就输了。找到所有数的最大公约数,设为k那么所有数就可以表示成为a1 * k,a2 * k,a3 * k....an * k.(假设an最大)所以加进去的数一定是m * k (1 所以看1,an有多少个数,如果有奇数个就一定是Alice赢,否则BobAC代码:#in
2013-09-21 15:18:59
653
原创 uva11069
找一个1-n的子集,满足两个条件(1)任何数不能相差1(2)向其中插入不存在其中的1-n的数一定会存在一个数和其相差1.用递归来统计。f[i]表明选用了1-i个数中最后一个数。那么f[i] = f[i - 3] + f[i - 2],因为选了i一定就要么选i - 2,要么选i - 3最终答案是f[n] + f[n - 1]AC代码:#include #
2013-09-18 14:38:31
738
原创 codeforces_330c
木有做出来,发现是在求组合数模的时候求错了。今后涉及取模运算除法的应该把其逆求出来,而不应该直接拿出来除之后再去求逆。AC代码:#include #include #include using namespace std;const int MAX_NUMBER = 1000007;const long long MOD_NUMBER = 1000000007; lo
2013-09-14 19:31:17
649
原创 ural 1860
求f[i]的不同因子数。f[i] = i * f[i - 1] * f[i - 2],f[1] = 1, f[0] = 1类似斐波拉契数要想到斐波拉契数列。f[2] = 2f[3] = 2 * 3f[4] = 2 * 2 * 3 * 4f[5] = 2 * 2 * 2 * 3 * 3 * 4 * 5所以f[i]中k的个数和斐波拉契数有关。个数为fi[n - k],因为n的个
2013-08-23 22:48:21
694
原创 sgu491
求满足ax + by = n,(x >= 1, y >= 1)的a,b有多少个。比赛时候没有做出来,是因为想到只知道n,要求a,b,x,y枚举的话4个铁定超时如这类找满足条件个数的,如果不能暴力枚举的话都要尽量去转化成为求因子个数。转化成n - ax = by,枚举a,x,那么b的个数就相当于n - ax中的因子个数,依次检查每个因子,要比a大,然后去重统计。#include #
2013-08-15 22:46:02
526
原创 uva12585
好吧。。比赛的时候竟然没做出来,就是一个精度控制问题,一直老想怎么去解方程。因为精度为1e-6,所以当某局进行概率非常小的时候直接可看做0返回就行了,而不要继续进行计算下去。设进行到某局的概率为p,进行到该局已经进行到的局数为r如果p非常小的话,接下来要进行的局数就是0.否则:如果a >b,那么当前局赢的概率就为p * 0.5,然后再加上下一局赢的概率dfs(a - b, 2 *
2013-08-11 21:43:36
638
原创 codeforces 336c
一开始想错了。想到要被2^k整除,那么找到最大的lowbit(x)即可。但是也有可能实际答案比lowbit还要大。所以应该直接枚举k,然后看是否有和2^k - 1一系列与之后为0的,如果有的话说明k满足,k从大到小枚举即可。AC代码:#include #include const int MAX_NUMBER = 100006;int value[MAX_NUMBE
2013-08-10 23:27:23
760
原创 hdu4196
从1-n里面选数,数的乘积要求是完全平方,求这个乘积的最大值,要求mod 1000000007对n!进行素因子分解,如果素因子是奇数的话,要变成偶数,也就是n!要除以该素因子。否则的话就保留该素因子。首先筛素数,然后对n!进行素因子计算。把要除的积保存在一个数里面。最后求n! / 该数,也就是对该数关于mod_number的逆,mod_number = 100000007为素数,就相当
2013-08-08 21:00:11
649
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人