随笔分类 -  POJ

摘要:数学,规律,构造类问题题意,就是以任意一个点为中心,交换它左右两个点的位置。一开始想这题,有个地方错了,所以一直想不到,就是把所有黑子当成一样的,白子当成一样,这样想也不是说错,但是这样想会限制了思维然后换一种思维,给所有棋子按1到n编号,就算颜色相同,编号也不同,是不同的棋子。然后我们看看交换的时候会发生什么事情以点a为中心,那么a-1和a+1发生交换,那么也就是说,编号a-1的点去了a+1的位置,如果继续交换的话,它还可以去到a+3,a+5……的位置,这里有一个突破点就是,它所在的位置的奇偶性不行,如果它一开始就在奇数的位置,无论怎么交换它还是在奇数位置,偶数亦然。但!不要这么轻易下结论, 阅读全文
posted @ 2013-06-12 20:11 Titanium 阅读(594) 评论(0) 推荐(0)
摘要:搜索题意:先给出大方阵的边长,再给出m个小方阵并给出每个方阵的边长,问是否可以不发生重叠地把小方阵放进大方阵中,并且大方阵完全利用没有剩余这题的代码不难写,关键是要找到策略,这题的策略比搜索本身的剪枝更有价值摆放小方阵的策略是,尽可能往上面摆,然后尽可能往左边摆。另外有个策略一开始想错了,我是想先把小方阵排序,先放好大的,再放好小的,这样在摆放过程中可能出问题,画图可知,正确的策略是就目前的摆放情况,能放得到下哪个就放哪个,无所谓大小为了满足尽可能放在左上方的条件,需要记录大方针的状态col[i]的意义是,第i列,从最顶部数下来,被连续占据了多少格注意在整个摆放过程中,每一列都保证是被连续占据 阅读全文
posted @ 2013-06-12 18:06 Titanium 阅读(263) 评论(0) 推荐(0)
摘要:二分题意:给出n条线段,以米的单位给出,小数点后两位(精确到厘米),要你对这些线段裁剪,裁剪出m条等长的线段,并且让这些线段尽可能长另外线段的长度不能小于1厘米,如果筹不够m条,输出0.00做法就是二分答案,但是二分的区间有讲究一开始我认为长度的上限应该是 min { len[i] },即最短的那条线段,后来才想到是错的,应该是max{ len[i] },因为有一点想当然了,认为裁剪线段,就是每条线段都要裁剪,其实不是的,并不是每条线段都要裁剪好像4 22.003.004.00答案是2.00吗?不是的,应该是3.00,虽然3.00大于第一条线段的长度,那么就不要裁剪第1条线段,直接从第2,第3 阅读全文
posted @ 2013-06-11 18:37 Titanium 阅读(2767) 评论(0) 推荐(1)
摘要:欧拉回路题意:给一个有向图,判断是否是欧拉回路,并且输出路径, 要求字典序最小。其中输出时这个给的,x y z,x和y是点的编号(点数最多44),z是边的编号(这边是有编号的,边数最大1995),其中输出路径不是输出点而是输出边的编号,所以字典序最小是指边的字典序最小。每组数据以0 0 结束。其中每组数组的第一行,两个点x,y,选较小的那个作为起点这题,图是保证连通的,所以不需要判断连通,所以判断是不是欧拉图,只需要看每个点的度是否都为偶数,不是的话则不存在欧拉回路,是的话就存在欧拉回路输出字典序最小的路径,环一个建图方法即可e[k][0] , e[k][1]表示第k条边的两个顶点我们用递归的 阅读全文
posted @ 2013-06-07 18:20 Titanium 阅读(269) 评论(0) 推荐(0)
摘要:树题意:给一个有向图,判断是否为有根数树这题应该来讲是个水题但是OJ将其归为星题,主要是容易WA,理清逻辑就可以了注意:有根树的判定,1.连通,2边数+1 = 点数 3.无环 由两个可以推到另一个做这题紧紧抓住树的定义即可,另外处理一下下面的一些特殊情况1.题意要求是树,不能是森林2.空树也是树,题目一开始说了3.数据中可能有自环,即1 1这种,这样就不是一棵树了3.有重边,1 2 , 1 2,同样不是树4.有环,1 2 , 2 1,同样不是树5.横叉边 2 3 , 4 3 , 同样不是树网上都说并查集,其实不用那么麻烦,就模拟一下即可#include <iostream>#inc 阅读全文
posted @ 2013-06-07 14:57 Titanium 阅读(298) 评论(0) 推荐(0)
摘要:二分, 数学用分段的思想解决定义3个数组len[i]表示i这个数字有多少位,len[1-9] = 1,因为个位数只有1为,len[10-99] = 2,有两位………………num[i]表示1到i,一共占了几位,num[9]=9,因为123456789,num[10] = 11, 12345678910sum[i] = num[1]+num[2]…………num[i]sum[4] = 10 , 因为1121231234所以对于一个位置n,用分段的思想,不断缩小范围先找到sum[m] <= n && n < sum[m+1]然后求出差值 delta = n - sum[m] 阅读全文
posted @ 2013-06-06 11:39 Titanium 阅读(377) 评论(0) 推荐(0)
摘要:LCA题意:一个无根树,给出主角一开始所在的位置S,然后下面q个操作,操作包括查询和修改操作,对于查询操作就是当前主角的位置到目的点的距离是多少,然后主角去到那里之后就在那里等待,下次查询的时候那里就是新的起点(所以sample中第二次查询为什么是3)。修改是修改第k条边的权值,边的编号就是输入的顺序。这题可能是数据水了还是怎么,对于修改操作虽然有优化的方法,但是用最朴素的直接遍历下去修改也是可行的,不会超时,不过时间就比较糟糕了修改操作其实是修改了一部分子树的dir值,对于查询操作就是普通的LCA这里只能用RMQ了,不能用Tarjan#include <iostream>#inc 阅读全文
posted @ 2013-06-01 00:41 Titanium 阅读(998) 评论(2) 推荐(0)
摘要:LCA参考Yuan神博客:/*题意:给出一棵节点有值的树,给出Q个询问(a,b),问从a到b的最大盈利(即:先在最小值买入,再在最大值卖出)我有想过用一个新序列w2-w1,w3-w2,,wn-wn-1这样只需用O(n)求得最大子段和即为结果Max-Min了但Q很大,每次都找一个路径会超时用类似Tarjan算法进行处理,但在find()那里要修改一下对每个几点记录4个值up[v]表示从v到目前的根的最大盈利down[v]从目前的根到v的最大盈利Max[v]表示到目前的根的最大值Min[v]表示到目前的根的最小值转移看update!在LCA(u,v)处再来计算,这样那四个值才是正确的值!!*/#i 阅读全文
posted @ 2013-05-31 17:20 Titanium 阅读(1759) 评论(1) 推荐(0)
摘要:LCA题意:先给出一棵无根树,然后下面再给出m条边,把这m条边连上,然后每次你能毁掉两条边,规定一条是树边,一条是新边,问有多少种方案能使树断裂。我们知道,这m条边连上后这颗树必将成环,假设新边为(u,v),那么环为u---->LCA(u,v)------->v-------->u,我们给这个环上的边计数1,表示这些边被一个环覆盖了一次。添加了多条新边后,可知树上有些边是会被多次覆盖的,画图很容易发现,但一个树边被覆盖了2次或以上,它就是一条牢固的边,就是说毁掉它再毁掉任何一条新边都好,树都不会断裂,这个结论也是很容易证明的,画图更明显,所以不累述所以这启发了我们,要统计所有 阅读全文
posted @ 2013-05-31 17:19 Titanium 阅读(1880) 评论(0) 推荐(0)
摘要:连通分量+LCA题意:一个无向图可以有重边,下面q个操作,每次在两个点间连接一条有向边,每次连接后整个无向图还剩下多少桥(注意是要考虑之前连了的边,每次回答是在上一次的基础之上)首先运行一次tarjan,求出桥和缩点,那么远无向图将缩点为一棵树,树边正好是原来的桥。每次连接两点,看看这两点是不是在同一个缩点内,如果是,那么缩点后的树没任何变化,如果两点属于不同的缩点,那么连接起来,然后找这两个缩点的LCA,,因为从点u到LCA再到点v再到点u,将形成环,里面的树边都会变成不是桥。计数的时候注意,有些树边可能之前已经被标记了,这次再经过不能再标记首先按思路写了个代码,跑了2s多,因为显式建树了。 阅读全文
posted @ 2013-05-29 15:31 Titanium 阅读(2593) 评论(3) 推荐(0)
摘要:LCA题意:LCA模板题,输入n和m,表示n个点m条边,下面m行是边的信息,两端点和权,后面的那个字母无视掉,没用的。接着k,下面k个询问lca,输出即可有人说要考虑不连通的情况,我没考虑AC了,另外可能有u,u这样的询问,不过这不影响,照样是写模板,没有特判,一样能过还是Tarjan快一些LCA转RMQ在线算法#include <iostream>#include <cstdio>#include <cstring>#include <cmath>using namespace std;#define N 40010#define M 25in 阅读全文
posted @ 2013-05-27 18:26 Titanium 阅读(2247) 评论(0) 推荐(0)
摘要:状态压缩DP + 优先队列BFS题意:给一个矩阵图,图中只有一个*表示起点,#表示不能到达的点,从A开始有k个大写字母(一定是连续的前k个,但是每个字母的个数不一定),一种大写字母表示一种矿石,一个矿石有两个值ai,bi,表示收集这个矿石需要ai电量,另外,在一个矿石点,可以选择收集或者不收集直接走掉,收集后每走一步,需要多加bi的电量,一开始没有任何矿石,每走一步需要1电量,另外,一开始给你P电量。走的方向是上下左右四个方向。你的任务是在电量用完之前,收集到每种矿石(每种矿石只需要1个),然后回到起点,但是注意一点,在没有收集完之前,不能回到起点,因为一旦回到起点就会瞬间传送回基地。如果有的 阅读全文
posted @ 2013-05-24 21:33 Titanium 阅读(397) 评论(0) 推荐(0)
摘要:RMQ模板题,用ST算法//DP预处理//dp[i][j] 表示从下标i开始,长度为2^j的最大值//状态转移方程 dp[i][j] = max{ dp[i][j-1] , dp[i+2^(j-1)][j-1] }//也就是一个长度为2^j的区间,二分为两个2^(j-1)的长度//对于查询[a,b]以内的最大值,先求出区间长度LEN = b-a+1//查询结果为 res = max{dp[a][k] , dp[b-2^k+1][k]} , 关键是k,是什么,怎么计算//当满足 2^k >= LEN/2 , 且k最小时,这个k就是我们要的值//k可以用计算公式一步算得 : k = (int 阅读全文
posted @ 2013-05-24 13:47 Titanium 阅读(178) 评论(0) 推荐(1)
摘要:强连通分量题意:一个n行m列的矩阵图,上面有3种点,可能是数字x(0<=x<=9),表示这里有多少个矿石,#表示不能走到这点,*表示传送点,对应一个目标点,可以瞬间传送到目标点。你从(0,0)左上角处出发,行走的方向只能是向左或者向下,要求你走到某个地方(不一定是右下角),让你得到的矿石最多。一个地方的矿石只能采集一次,下次再去到那个点是没有矿石的。注意几点,传送点可能将你传送到#这种点,那么相当于这个传送点是多余的等于没用,另外在传送点可以选择传送或者不传送继续走。分析:由于传送点的存在,可能使这个有向图构成环,进而可能产生强连通分量,所以先建图,进行一次强连通分量缩点,为什么缩 阅读全文
posted @ 2013-05-24 09:29 Titanium 阅读(400) 评论(0) 推荐(0)
摘要:强连通分量题意:给一个有向图,对于图中任意两个点u,v,如果从u能到v,或者,v能到u,则这对顶点是可行的,如果图中任意一对顶点都是可行的,可以输出Yes,否则输出No这个的话,就不是裸的强连通分量了。思考一下,对于一个有向图而言,里面的强连通分量肯定满足题目的条件,因为强连通分量内是u可到v,而且,v可到u,所以我们第一步工作就是强连通分量缩点,变为一个DAG。对于这个DAG里面的任意两个点U,V,如果满足题目的条件,那么点U,V里面包含的原图的点也肯定是满足的所以问题转化为怎么判断这个DAG是满足题目条件呢?其实判断很简单,就是看这个DAG里面有多少个点的入度为0,多少个点出度为0如果DA 阅读全文
posted @ 2013-05-23 11:15 Titanium 阅读(993) 评论(1) 推荐(0)
摘要:双连通分量题意:输入比较恶心,没有说有多少点,点的标号也不一定,只给出了边。一个无向图,但是保证是连通的(所以只要做一次dfs),问那些电脑坏了,会使整个网络断开分成几个部分。其实很直白就是求割点。输出就是,如果整个图为点双连通分量,则输出No SPF nodes , 否则按标号从小到大输出每个割点,并且输出,去掉该点后,整个图会分成几个部分这题算是个模板题,但是WA了,是因为模板有问题,也是自己对双连通分量的理解有问题,改了一下模板过了,发现自己之前想的东西有点复杂,把模板一些细节处搞错了,但是之前做了几道题都是1Y的,这个题目错了,感觉错得很值。对于什么是割点,在这里不说了,百度很多,对照 阅读全文
posted @ 2013-05-21 22:35 Titanium 阅读(597) 评论(0) 推荐(0)
摘要:双连通分量题意:给一个无向图,问要添加多少条边形成边双连通分量。注意图一开始是连通的,所以只要从一个点开始dfs一次就行了,另外这图有重边,(1,2)(2,1)这样,则1,2就形成了一个边双连通分量。之前写的求边双连通分量的代码不能处理重边,但是要修改过来其实挺简单的。重边无非是遇到一个问题,从u走到v,按一般的做法,是不能从v回到u的,即不能马上就回到它父亲节点去(其实指的是不能重复走这条边,这条边虽然是无向边但是只能走一次),但是有了重边后,是可以马上回到它父亲处的,只不过走的是另一条边。所以我们可以标记哪些边用过了,每条边只能用一次,用过一次后不能再用。而且别忘了,建图的时候,无向边是分 阅读全文
posted @ 2013-05-19 17:25 Titanium 阅读(274) 评论(0) 推荐(0)
摘要:推荐技术公众号:不爱睡觉的大猪 双连通分量 题意:比较裸的题意,就是给一个无向图,问添加多少条边后能使整个图变成双连通分量 分析:建议先学了双连通分量的相关知识,因为这题是算是个模板题(我自己写了模板,过了这题,但是还没有充分测试),如果没学好相关知识即便这个模板题也不好懂 双连通分量分为【点双连通 阅读全文
posted @ 2013-05-18 19:41 Titanium 阅读(2001) 评论(6) 推荐(1)
摘要:继续复习二分图题意:比较裸的二分图,输入n,表示n个不同的课程,下面n行,每行首先是m,表示后面跟着m对信息,每对信息为(p,q),表示在星期p的第q节上这节课,(一周7天,一天12节课)。问你怎么匹配,可以让这个人一周上最多的课。建立二分图,X为时间,[0,83],Y为课程,[0,n-1],然后有向边Y--->X,进行匈牙利一次即可#include <cstdio>#include <cstring>#define N 410#define M 50500int n,tot;int match[N];int head[N];struct edge{ int u, 阅读全文
posted @ 2013-05-10 20:55 Titanium 阅读(270) 评论(0) 推荐(0)
摘要:/*题意:给一个有向图,问有多少个点,是其他点都可以到达的其他点都可以到达该点,那么将图转置,就变为该点可以到达其他所有的点要找这样的点方法有很多,仿照Floyd的DP方法就是最容易写,但是点太多达到10000,会超时这里用SCC来做将转置后的图进行缩点,得到一个DAG,这个DAG每个大点内的小点(即原来的点)都是相互可达,关键是看这些大点能不能去到其他大点,如果一个大点能去到其他所有的大点,那么里面的小点也可以所以就是要找,有多少个大点,可以去到所有其他的大点,可知这样的大点,最多1个!!,而且是入度为0的点(这个不难理解,可以思考一下)找到了这个大点,那么里面包含的小点就都是可以的,所以扫 阅读全文
posted @ 2013-05-10 12:08 Titanium 阅读(223) 评论(0) 推荐(0)