随笔分类 - 数据结构
HDU 4118 Holiday's Accommodation (dfs)
摘要:题意:给n个点,每个点有一个人,有n-1条有权值的边,求所有人不在原来位置所移动的距离的和最大值。 析:对于每边条,我们可以这么考虑,它的左右两边的点数最少的就是要加的数目,因为最好的情况就是左边到右边,右边到左边,然后用dfs就可以解决了。 代码如下:
阅读全文
POJ 2002 Squares (哈希)
摘要:题意:给定 n 个点,问有能组成多少个正方形。 析:通过直接桥梁两个顶点,然后再算另外两个,再通过哈希进行查找另外两个,这里我先是用的map,竟然卡过了3400ms多,后来改成哗哈希,900ms,哈希我也是用STL中的容器来写的,list,先枚举的那两个点是相邻的,然后再通过旋转90度,去计算另外两
阅读全文
PAT 1017 Queueing at Bank (25) (坑题)
摘要:Suppose a bank has K windows open for service. There is a yellow line in front of the windows which devides the waiting area into two parts. All the c
阅读全文
HDU 1540 Tunnel Warfare (线段树或set水过)
摘要:题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少。 析:首先可以用set水过,set用来记录每个被破坏的村庄,然后查找时,只要查找左右两个端点好。 用线段树的话,就维护三个值分别是左端点连续右端点连续,全连续的最长的区别,然后用线段树维护就好。 代码如下
阅读全文
HDU 3974 Assign the task (DFS+线段树)
摘要:题意:给定一棵树的公司职员管理图,有两种操作, 第一种是 T x y,把 x 及员工都变成 y, 第二种是 C x 询问 x 当前的数。 析:先把该树用dfs遍历,形成一个序列,然后再用线段树进行维护,很简单的线段树。 代码如下:
阅读全文
CodeForces 566D Restructuring Company (并查集+链表)
摘要:题意:给定 3 种操作, 第一种 1 u v 把 u 和 v 合并 第二种 2 l r 把 l - r 这一段区间合并 第三种 3 u v 判断 u 和 v 是不是在同一集合中。 析:很容易知道是用并查集来做,但是如果单纯的用并查集,肯定是要超时的,所以要用链表,如果合并了,就把链表指向, 这样就搞
阅读全文
CodeForces 145E Lucky Queries (线段树)
摘要:题意:给定一个47序列,然后有两种操作, 1.switch l, r 把区间内的4变成7,7变成4 2.count 计算整个区间的最长的非降序序列长度。 析:一个很裸的线段树,就是维护几个值,一个是只有4的长度,一个只有7的,一个47都有的,每个都维护正着反着,然后就很简单了。 在更新时,4和7直接
阅读全文
CodeForces 384E Propagating tree (线段树+dfs)
摘要:题意:题意很简单么,给定n个点,m个询问的无向树(1为根),每个点的权值,有两种操作, 第一种:1 x v,表示把 x 结点加上v,然后把 x 的的子结点加上 -v,再把 x 的子结点的子结点加上 -(-v),依次。。。 第二种:2 x, 表示查询 x 结点的权值。 析:因为这是一棵树,很难维护,所
阅读全文
CodeForces 400D Dima and Bacteria (并查集+Floyd)
摘要:题意:给出 n 个细菌,m 种仪器,细菌有 k 种,每种细菌数量 c[i],给出从第 ui 细菌到第 vi 个细菌转化需要的花费。判断同种细菌之间的转化是不是花费都可以是0,如果可以再输出不同种细菌之间转化的最小花费。 析:首先要判断是同种细菌是不是转化花费为0,如果数据小的话,可以用Floyd,但
阅读全文
CodeForces 85D Sum of Medians (线段树)
摘要:题意:给你3种操作:1. 向集合中加入数x。2.在集合中删除数x。3.求和sum: 将集合中的数组排好序,将下标(从1开始) 对5取模为3 的位置的数求和。 析:利用线段树维护6个值,首先是1-5表示每五个一组的和,然后还有要维护一个该字段的长度,因为其中有删除和增加操作,还有我们要对原数据进行离散
阅读全文
HDU 5695 Gym Class (拓扑排序)
摘要:题意:略。 析:当时比赛真是脑残了。。。。一直想什么拓扑模板,其实并不需要么,当时脑子短路了。。。。完全可以直接根据题意写的,用优先队列 维护一下就好。最近没刷题真是落后了。。。。不说了,太水了。 代码如下:
阅读全文
ZOJ 2301 Color the Ball (离散化+线段树)
摘要:题意:有从 1 开始递增依次编号的很多球,开始他们都是黑色的,现在依次给出 n 个操作(ai,bi,ci),每个操作都是把编号 ai 到 bi 区间内 的-所有球涂成 ci 表示的颜色(黑 or 白),然后经过 n 次给定的操作后,求最长的连续白色区间的左端点和右端点。 析:由于数比较大,可以先进行
阅读全文
CodeForces 404C Restore Graph (构造)
摘要:题意:让人构造一个图,满足每个结点边的数目不超过 k,然后给出每个结点到某个结点的最短距离。 析:很容易看出来如果可能的话,树是一定满足条件的,只要从头开始构造这棵树就好,中途超了int。。。找了好久。 代码如下:
阅读全文
HDU 3001 Travelling (状压DP + BFS)
摘要:题意:有一个人要去旅游,他想要逛遍所有的城市,但是同一个城市又不想逛超过2次。现在给出城市之间的来往路费,他可以选择任意一个点为起点。 问逛遍所有城市的最低路费是多少。 析:用三进制表示每个城市的访问次数,然后 bfs 进行遍历,不过要注意这个题卡内存,必须要去年一些无用的状态,要不然会超内存的,还
阅读全文
POJ 3411 Paid Roads (状态压缩+BFS)
摘要:题意:有n座城市和m(1<=n,m<=10)条路。现在要从城市1到城市n。有些路是要收费的,从a城市到b城市,如果之前到过c城市,那么只要付P的钱, 如果没有去过就付R的钱。求的是最少要花多少钱。 析:BFS,然后由于走的路线不同,甚至边或者点都可能多走,所以用状态压缩。然后本题有坑啊,有重连,而且
阅读全文
CodeForces 279C Ladder (RMQ + dp)
摘要:题意:给定一个序列,每次一个询问,问某个区间是不是先增再降的。 析:首先先取处理以 i 个数向左能延伸到哪个数,向右能到哪个数,然后每次用RQM来查找最大值,分别向两边延伸,是否是覆盖区间。 代码如下:
阅读全文
URAL 2014 Zhenya moves from parents (线段树)
摘要:题意:儿子身无分文出去玩,只带了一张他爸的信用卡,当他自己现金不足的时候就会用信用卡支付,然后儿子还会挣钱,挣到的钱都是现金, 也就是说他如果有现金就会先花现金,但是有了现金他不会还信用卡的钱。他每花一次钱和挣一次钱都会给他爸发一条短信,告诉他挣/花的钱和时间, 但是给出的短信顺序时间可能不是按顺序
阅读全文
URAL 2019 Pair: normal and paranormal (STL栈)
摘要:题意:在一个半圆内,有2*n个点,其中有大写字母和小写字母。其中你需要连接大写字母到小写字母,其中需要保证这些连接的线段之间没有相交。 如果能够实现,将大写字母对应的小写字母的序号按序输出。 析:我把它看成一个括号序列,然后用栈解决即可。 代码如下:
阅读全文
HDU 5236 Article (概率DP+贪心)
摘要:题意:要求输入一篇N个字符的文章,对所有非负整数i:每到第i+0.1秒时可以输入一个文章字符,每到第i+0.9秒时有P的概率崩溃(回到开头或者上一个存盘点) 每到第i秒有一次机会可以选择按下X个键存盘,或者不存,打印完整篇文章之后必须存盘一次才算完成输入多组N,P,X选择最佳策略使得输入完整篇文章时
阅读全文