随笔分类 - Poj
摘要:题意:有一个1到n的一个被打乱的排列,告诉你每个数的左边有多少个数比它小,显然第一个数左边没有比它小的数,求每个位置上的数。分析:用树状数组可以求出某一个序列中所有左边小于等于array[]的个数。这个题正好相反,已知每个数左边小于它的个数,求这个序列。用树状数组也可以做,但是没有线段树好理解。线段树中num记录[l,r]中还剩余多少人尚未被确定代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 using namespace std; 5 const
阅读全文
摘要:题意:给出一堆坐标点,求小于每一个坐标的坐标个数。分析:这个题显然也不能遍历,数据太大,会超时。从poj2299,知道树状数组可以用来求一个排列中array[i]前面小于等于array[i]的个数。例如array[i]= 9 1 0 5 4通过树状数组可以知道:array[1]=9--->1 即坐标小于等于1中比9小的个数为1.array[4]=5--->3 即坐标小于等于4中比5小的个数为3.具体怎么求呢?2299中也说过,构建树状数组时要将array[]进行排列,然后对对应的number号进行处理,即:1.要求原来顺序 9 1 0 5 4,前面小于等于array[i]的个数,先
阅读全文
摘要:题意:求逆序对。分析:以前用分治的思想写的,这次用树状数组。以array[]=9 1 0 5 4 为例,1.对于每个array[i],求出小于等于array[i]的个数:9:11:10:15:34:3个这里如果遍历求的话,就超时了。因此需要构建树状数组,树状数组需要离散化。有:array[] 9 1 0 5 4num1 2 3 4 5这里不压缩要1--n内有时也行,如果数据小的话。比如这个例子就行,离散到大于等于1就行。但是如果数据大的话,就得压缩压下。2.用树状数组求小于等于array[i]的个数应该以array[]由小到大排序遍历i 1 2 3 4 5array 0 1 4 5 9num
阅读全文
摘要:题意:把一个完全图分成两部分,使得连接这两部分边的权和最大。分析:图论的无向完全图的最大割问题可以用 随机化算法 Random Algorithm 去做。参考http://blog.csdn.net/lyy289065406/article/details/6648571代码:View Code 1 #include <iostream> 2 #include <memory.h> 3 #include <stdio.h> 4 //#include <time.h> 5 #include <stdlib.h> 6 using name
阅读全文
摘要:题意:给出两个数n,nc,并给出一个由nc种字符组成的字符串。求这个字符串中长度为n的子串有多少种。分析:1.这个题不用匹配,因为不高效。2.将长度为n的子串看作n位的nc进制数,将问题转化为共有多少种十进制数字。3.哈希时,每一个字符都对应这0---nc-1的一个数字。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 using namespace std; 5 const int maxnum=1600000; 6 char str[maxnum
阅读全文
摘要:题意:双核电脑上有N个模块,可以在核A或核B上运行,运行时间不同.此外有M组数据(u,v,w)表示从模块u与模块v之间传输,如果模块u和模块v在同一个核心里运行,则传输不需要时间,否则需w时间,求用最少时间使这N个模块在电脑上运行,并完成数据传输.分析:一开始真的不知道使用网络流。看到分配成两部分的题,就要想到网络流最小割的问题。最小割.建图:N个模块当作N个点,从源点到这N个点,容量为在A核运行时间,再连一汇点,容量为在B核运行时间,另外,M组数据传输(u,v,w),连u->v(w),v->u(w);dinic+邻接表。TLE了。这是为什么呢?以后还得考虑啊。View Code
阅读全文
摘要:题意:给的就是n个虫子 m对虫子发生过关系 然后问有没有虫子是同性恋。分析:题目等价为,n个点,m条边,能否仅用两种颜色染完所有点,并使每条边的两个点不同色。bfs,遍历每个顶点,如果相邻顶点染有相同的颜色,说明有同性恋!代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 #include <queue> 5 using namespace std; 6 const int maxnum=2001; 7 bool array[maxnum]
阅读全文
摘要:题意:分配问题,有F种食物,D种饮料,N头牛,每头牛有自己喜欢的吃的和喝的东西,现在让你去分配,使得吃喝都得到的牛最多。每种吃喝的东西只能招待一头牛。分析:把一头牛拆成两头,一头和食物连,一头和饮料连,当然这两头牛之间肯定要连一条边,添加一个源点汇点分别向食物和饮料连。这里把牛拆成两个点是为了限制进过牛的流最大为1,这样就可以通过求最大流来得到答案。举例说明为什么要拆牛:(见discuss)比如只有1条牛,1 2 两种食物,1 2两种水那图会是下边那样的食物1 食物2 | | | | -----> 牛 <---- / \ / \ 水1<--| |----> 水2对应的输
阅读全文
摘要:题意:经典的图的染色问题,求对于给定的无向图中,给每个结点染两种不同颜色(黑色和白色)的一种且相邻结点的颜色不同,求染成黑色的最多结点数。分析:这个题求的图的最大独立集,最大独立集即为黑色节点的个数。由于原图的最大独立集=补图的最大团。而这个题是普通图,所以用回溯法来做,时间复杂度O(n*2^n)代码:View Code 1 #include <iostream> 2 #include <memory.h> 3 #include <stdio.h> 4 using namespace std; 5 6 const int maxnum=101; 7 bool
阅读全文
摘要:题意:已知班级有g个女孩和b个男孩,所有女生之间都相互认识,所有男生之间也相互认识,给出m对关系表示哪个女孩与哪个男孩认识。现在要选择一些学生来组成一个团,使得里面所有人都认识,求此团最大人数。思路:最大团问题。定理:原图的最大团=补图的最大独立集原图的最大独立集=补图的最大团。由于这个题的补图显然是一个二分图,而二分图的补图的最大独立集可以由匈牙利算法求的,所以该题的最大团问题可以转化成补图的最大独立集来做。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h&g
阅读全文
摘要:在算法篇介绍过求这样的某一个范围内第k大的数的三种方法。分治方法,对于求一组范围内的值可以考虑。但是求多组的时候就不行了,因为这种方法会改变原数组的排序。如果要有多组询问时,就必须赋值到另外一个数组中,结果TLE.代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxnum=100005; 8 int array[maxn
阅读全文
摘要:题意:这个题首先给出一个01序列,这个序列的意思是,从一个树的根开始遍历,遇到0走到一个孩子,遇到1则当前节点返回到它的父亲节点,最后回到树的根。求对这样两个01序列进行遍历后形成的两颗树是否同构。分析:1.这个序列中的0和1个数必须相同,否则无法回到根。有几个0就有几个节点。2.遍历01序列建树,记录每个节点的深度和孩子个数,然后排序进行比较。3.一开始,我记录每个节点的孩子个数仅限于孩子(没有记录孙子,曾孙等),结果WA了。应该记录每个节点的所有后代的个数。4.这道题我用的是静态链表。代码:View Code 1 #include <iostream> 2 #include &
阅读全文
摘要:题意:这个题类似poj2965,但是这个题翻转操作是:翻转单位(i,j)以及与(i,j)相邻的单位。目标也是要求翻转为全白或者全黑需要翻转的次数。分析:枚举第一行(即对第一行的方块进行翻转),16种可能性。翻转第二行的方块,修改对应列的第一行的方块,使得第一行全黑/白。翻转第三行的方块,修改对应列的第二行的方块,使得第二行全黑/白。翻转第四行的方块,修改对应列的第三行的方块,使得第三行全黑/白。最后查看第四行是否满足全黑/白。若不满足,则"Impossible"(只要有一种枚举不满足,其它的枚举也不满足,反之,只要有一种枚举满足,则所有的枚举都满足,因为同一个方块翻转两次,
阅读全文
摘要:题意:有一个4*4的+,-矩阵,矩阵中'+'代表门是开着的,'-'代表门是关着的。每一次翻转操作是将对应位置的x和y轴的所有门都进行翻转。求将所给出的状态变成门都开着的状态所需要翻转的门的个数。分析:1.'+'对应位置的行与列各个单位都进行一次翻转操作,那么整个图中只有这个'+'的位置符号改变了。2.因此只要对初始状态中的每一个'+'都进行一次操作,整个图中对应翻转的位置由0开始累加。最后取余2,得到为1的位置就是需要翻转的位置。3.整个图中需要翻转的最大次数是16次。代码:View Code 1 #include
阅读全文
摘要:题意:famer给出一些fields,paths,wormholes.其中paths是fields之间的双向正权值边,wormholes是fields之间的单向负权边。求在这个图中是否存在权值为负的回路。这个题用的是bellman_ford算法。其中有一下几个问题:1.在描述Paths时,a bidirectional path between S and E that requires T seconds to traverse. Two fields might be connected by more than one path. 当时没有看到是双向边,WA了。还有,我没有对后半句处理,
阅读全文
摘要:题意:给出一个200以内的数n,求出这个数的倍数M,使得M中只有0和1组成。M最多100位。分析:这个题竟然用的是bfs的思想。不看讨论真的想不出来。思路是这样的:1.最高位一定是1.curnum%n不为0时,说明curnum不符合要求。2.判断curnum*10%n和(curnum*10+1)%n是否为0,不为0的话,令curnum=curnum*10和curnum*10+1继续做第二步。直到取余之后为0即可。3.这样就会遇到大数存储的问题。可以这样解决:令 (curnum*10+1)%n=a,求((curnum*10+1)*10+1)%m.由定理(a*b)%n = (a%n *b%n)%n
阅读全文
摘要:题意:X坐标轴上有A,B两点,两点的坐标都介于0与100000之间(包括),A点可以有两种方式走动:1.从A走到A-1或者A+1,用时1分钟。2.从A到2*A,用时1分钟,求从A到B最短的时间。分析:这个题用BFS,数组应该开多大呢?有的点乘以2后会比100000大。其实开100001就可以了。如果存在一个路径中有比100000还大的点,那一定存在一条所用时间还要小的所有的点都在100000一下的路径。代码很简单:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <queue> 4
阅读全文
摘要:题意:数独问题这个题思路很好想,但是在判断3*3小区域的时候出现了错误。写的时候还是稳一些吧,要不然调的时候会吐血的。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 using namespace std; 5 6 const int maxnum=10; 7 int array[maxnum][maxnum]; 8 bool flag; 9 int cur; 10 struct pos 11 { 12 int x; 13 int y; 14 }.
阅读全文
摘要:题意:染色问题,图中之间有边的两个区域不能染成相同的颜色。求将图中每个区域全部染色后需要最少的颜色。分析:参考染色定理得,无论图中有多少区域,最多需要4个区域。因此遍历这四种情况即可.代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 using namespace std; 5 6 const int maxnum=27; 7 bool array[maxnum][maxnum]; 8 int num; 9 10 void fuction()11 {
阅读全文
摘要:这也是一道DFS题,但写的还是不好。题意:给一个矩阵r*c,求骑士可以从任意一点开始,是否能将这个矩阵中的各个点都走一遍。分析:1.字典顺序啊,lexicographical,当时也没管啥意思,唉。2.不需要找到所有的情况,即如果遍历各点成功,就return ;代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 using namespace std; 5 6 const int maxnum=27; //27,怎么会是8呢 7 bool array[
阅读全文

浙公网安备 33010602011771号