随笔分类 - 数据结构
L2-013. 红色警报 (并查集)
摘要:战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报。 输入格式: 输入在第一行给出两个整数N(0 < N <=
阅读全文
POJ 1127 Jack Straws (线段相交)
摘要:题意:给定一堆线段,然后有询问,问这两个线段是不是相交,并且如果间接相交也可以。 析:可以用并查集和线段相交来做,也可以用Floyd来做,相交就是一个模板题。 代码如下:
阅读全文
POJ 3723 Conscription (最小生成树)
摘要:题意:给定 n 个男人,m 个女人,和 r 个男女之间的关系,每个征募一个人要用10000元,但是如果有关系可以少花一些钱,即10000-亲密度, 求一个最小要花多少钱。 析:最后生成的关系肯定是一片森林,也就是最大权森林,但是我可以把权值取反,然后就是一个求最小森林了。 代码如下:
阅读全文
POJ 2823 Sliding Window (单调队列)
摘要:题意:给定一个序列,从左到右每次的滑动一个窗口,最大值和最小值是多少。 析:普通的方法可能会超时,维护两个单调队列,一个单调递增的,一个单调递减,每次把最值保存下来。 也可以用线段树,RMQ等数据结构,每次查询区间的最小值和最大值。POJ 交G++ 死活超时,交C++才过。 代码如下:
阅读全文
UVaLive 3983 Robotruck (DP + 单调队列)
摘要:题意:有n个垃圾,第i个垃圾坐标为(xi,yi),重量为wi,有一个机器人,要按照编号从小到大的顺序剑气所有的垃圾兵扔进垃圾桶,垃圾桶在原点, 每次总重量不能超过C,两点间距离为曼哈顿距离,求出最短的距离和。 析:第一反应想到的状态是有个数和重量,一看,时间复杂度受不了,只能改。dp[i] 表示从原
阅读全文
UVaLive 3905 Meteor (扫描线)
摘要:题意:给定上一个矩形照相机和 n 个流星,问你照相机最多能拍到多少个流星。 析:直接看,似乎很难解决,我们换一个思路,我们认为流星的轨迹就没有用的,我们可以记录每个流星每个流星在照相机中出现的时间段, 然后我们可以枚举时间段么?不行,这个是实数集上的,所以我们用扫描线,就相当于在x轴上有n个区间,我
阅读全文
UVaLive 3902 Network (无根树转有根树,贪心)
摘要:题意:一个树形网络,叶子是客户端,其他的是服务器。现在只有一台服务器提供服务,使得不超k的客户端流畅,但是其他的就不行了, 现在要在其他结点上安装服务器,使得所有的客户端都能流畅,问最少要几台。 析:首先这是一棵无根树,我们可以转成有根树,正好可以用原来的那台服务器当根,然后在不超过 k 的叶子结点
阅读全文
POJ 1182 食物链 (破题)
摘要:食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 119148 Accepted: 36393 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。现有N个动
阅读全文
POJ 1703 Find them, Catch them (并查集)
摘要:题意:一共有N个人,给出M个操作分为两种: 1、A a b :提问a和b是否是同一个帮派的。有三种答案:是,不是和不确定 2、D a b :a和b不是同一个帮派的。 析:加权并查集,用一个r[i]来表示 i 和其父亲的关系,如果为0,表示 i 和其父亲是同一帮,1表示不是,每次更新即可。 代码如下:
阅读全文
POJ 3658 Artificial Lake (单调栈)
摘要:题意: 析:利用单调栈,维护一个单调递增的栈,首先在最低的平台开始,每次向两边进行扩展,寻找两边最低的,然后不断更新宽度。 代码如下:
阅读全文
HDU 3706 Second My Problem First (单调队列)
摘要:题意:求给定的一个序列中最长子序列,该子序列的最大值和最小值介于m和k之间。 析:用两个单调队列来维护一个最小值,一个最大值,然后每次更新即可。 代码如下;
阅读全文
UVa 12661 Funny Car Racing (dijkstra)
摘要:题意:给定一个有向图,每条路有5个整数修饰,u, v, a, b, t,表示起点为u,终点为v,打开时间a,关闭时间为b,通过时间为t,打开关闭是交替进行的, 问你从s到t最短时间是多少。 析:使用dijkstra算法,从每个结点出发,求最短路,并维护时间的最小值,这个可以用优先队列,然后考虑能不能
阅读全文
UVa 658 It's not a Bug, it's a Feature! (状态压缩+Dijstra)
摘要:题意:首先给出n和m,表示有n个bug和m个补丁。一开始存在n个bug,用1表示一个bug存在0表示不存在,所以一开始就是n个1,我们的目的是要消除所有的bug, 所以目标状态就是n个0。对于每个补丁,会给出使用这个补丁的时间,另外会给出两个长度为n的字符串,第一个字符串表示这个补丁适用于什么情况下
阅读全文
UVa 12333 Revenge of Fibonacci (字典树+大数)
摘要:题意:给定一个长度小于40的序列,问你那是Fib数列的哪一项的前缀。 析:首先用大数把Fib数列的前100000-1项算出来,注意,一定不能是100000,要不然会WA的,然后每个数取前40位,不足40位的全取,然后插入到字典树上, 并用一个数组标记是哪一项,最后查询的时候,如果查不到就是无解,否则
阅读全文
POJ 3419 Difference Is Beautiful (DP + 二分 + rmq)
摘要:题意:给n个数(n<=200000),每个数的绝对值不超过(10^6),有m个查询(m<=200000),每次查询区间[a,b]中连续的没有相同数的的最大长度。 析:由于n太大,无法暴力,也承受不了O(n*n)的复杂度,只能是O(nlogn),首先是用f[i] 表示每个数 i 为左端点,向右可以最多
阅读全文
CodeForces 755C PolandBall and Forest (并查集)
摘要:题意:给定每一点离他最远的点,问是这个森林里有多少棵树。 析:并查集,最后统计不同根结点的数目即可。 代码如下:
阅读全文
CodeForces 754D Fedor and coupons (优先队列)
摘要:题意:给定n个优惠券,每张都有一定的优惠区间,然后要选k张,保证k张共同的优惠区间最大。 析:先把所有的优惠券按左端点排序,然后维护一个容量为k的优先队列,每次更新优先队列中的最小值,和当前的右端点, 之间的距离。优先队列只要存储右端点就好。 代码如下:
阅读全文
POJ 3468 A Simple Problem with Integers (线段树)
摘要:题意:给定两种操作,一种是区间都加上一个数,另一个查询区间和。 析:水题,线段树。 代码如下:
阅读全文