POJ 3258 River Hopscotch

二分不会啊。。。

POJ 2299 Ultra-QuickSort

SXBK,总的交换次数会爆掉int。。。我他妈wa了一天

改造归并排序,保存交换次数就可以了

HDU 1969 Pie

二分的,然后要注意自已还得吃呢,别都给人家了,所以f要+1,然后在hdu上,用long double一定wa,不用想,改成double就好了。

就这样。

 

POJ 3518 Prime Gap

埃氏筛法,没啥好说的嗯。

HDU 1157 Who's in the Middle

我先给水过去,然后加难度。。。

POJ 2503 Babelfish

这个是拿map水过去的版本,其实应该自己手写一个的。。。

ZOJ 3820 ACM 牡丹江 Building Fire Stations

SXBK的一个题(对我现在的水平来说)

其实是这样,对于一棵树,在上面建1个消防站,最优位置在直径中心,建立两个消防站呢?其实可以把整个大树分成两个小树,在每个小树自己的直径的中心建立消防站就搞定了,在分树的时候,如果发生分歧(如果直径有奇数个点,就会出现这种分歧情况,如果有偶数个节点,中央节点有两个,直接从两个节点的中央裂开就行,不会产生分歧),这时候我把中央节点上连接的那些节点中除了直径上的两点之外的那些节点都叫做中立节点,我们只要进行两次讨论,一次把这些中立节点分入左半树,求出这种分法中左右半树的直径,然后把左右直径的最大值当成接下来判定哪个方法更好的基准(因为我们要的是最长距离的最小值),然后再把这些中立节点分入右半树,搞出相应的解,接下来我们比较刚才保存下来的基准,哪个小要哪种方案,这样我们就把最终的解搞出来了。

我觉得其实这种思路还可以推广,如果建立3个,4个乃至n个,我们也可以切割树求直径来搞。

然后切树是,我们可以通过把某个点“屏蔽”,来实现不会让dfs进入另一半子树的目的。

其实这个题还可以通过枚举大直径上的两点求出最优解来解决,思路也是比较清晰的。

 

HDU 4607 Park Visit

树的直径就是最长路,求法其实很简单的,就是两遍dfs,第一遍dfs把终点的节点编号输出来,第二次用这个节点当成起点再来一遍,这回输出最高深度,就是直径。

这个直径用法就是,如果需要过的节点数少于直径长度,说明不用拐弯,沿着直径走就ok,如果需要过的节点数大于直径长度,说明要拐弯,拐弯进去还要再出来,相当于走了两遍,所以是直径长度加上二倍多出来的分支长度,调整一下就ok了。

Asia – Tokyo – 2007/2008 UVa 3887 Slim Span

在kruskal的基础上,每一次干掉一条边,再kruskal一次,如果得到了生成树,就看看他的最大边权-最小边权是不是可以更新当前最优解,然后反复这么搞把所有边都搞掉就完成遍历了,因为事先已经对边权排序了,这么做并不会丢解。

POJ 1679 The Unique MST

这个题我没想出来,一种解法是首先对于每条边确认是不是还有和这条边权值相同的其他边,如果有的话标记上,然后先来一遍裸的kruskal,把第一遍kruskal用到的节点全都标记上,然后开始扫,如果当前边既有同权的其他边又被在第一次kruskal中使用了了,就把这个边干掉再来一遍kruskal,看看这次生成树的总权值变没变,如果没有变就说明生成树不唯一,如果变了,就保持着这个边被干掉的状态接着扫,碰见符合要求的再干掉(保持着以前干掉的边被干掉的状态,用剩下的边尝试组生成树.如果你不判断有没有同权的边直接挨个把第一遍用过的边干掉,也可以。

RE了好多次然后换个编译器就过了,我也不知道是我抽了还是oj抽了,还有可能是.size()这个函数因为是返回unsigned long如果-1的话可能故障,以后要么强制类型转换,要么开个常数存一下。

Scroll to top