题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=102504#overview
这套题放了很久一直没写,直到我终于发现,现在已经不得不练数据结构的时候了,于是把这套题翻了出来开始写,嘛……总之感谢UESTC的题目先。估计全部写完大概要一周的时间,最近又因为期末考试没什么时间,大概会拖很久吧……
【UESTC1059】秋实大哥与小朋友
题意为对一个连续区间[1,n],有两种操作,将某一段区间的值增加v,或者查询某一个点的值。题目中给定的n很大,需要使用离散化,修改和查询使用线段树和树状数组完成均可,使用树状数组时,是“修改区间,查询点”的一种使用方式,具体操作为,在增加的时候,执行add(l,v)和add(r+1,-v),使[1,l-1]和[r+1,n]的值不变,只改变[l,r]区间的值。查询的时候执行query(x),统计x节点的值,类似于统计覆盖线段的一种做法。除此之外我还查到另一种解法……等我看懂了把代码贴上来。
#include
#include
#include
【UESTC1057】秋实大哥与花
对于给定区间完成区间修改和区间查询,线段树的基本应用。
#include
#include
#include
【UESTC1060】秋实大哥与快餐店
给出一些数a[1..n],有两种操作,再给出一个数a[i],或是对一个数k,求出给定的数中与k异或值最大的数。字典树的应用,可以将给出的数a[i]转换为二进制串后,从高位到低位进行建树(为保证位数相同需要补零)。对于给定的数k,在走到第i层节点时,尽量寻找与k第i位值不同的节点,这样找到的数就是与k异或值最大的数。
#include
#include
#include
【UESTC1061】秋实大哥与战争
问题的实质在于寻找士兵k左右最近的死亡士兵,设左边最近的死亡士兵为l,右边的为r,则答案为r-l-1,也就是说,我们要完成(1)添加一个数(2)删除一个数(3)寻找与给定的数k最近的两个数,而集合set恰好能满足我们的需要(set是有序的,可以使用lower_bound进行查询),我们使用两个集合,一个集合存储正的坐标用来寻找l,另一个存储负坐标用于寻找r,在最开始需要把n+1和0添加到集合中。
#include
#include
#include
【UESTC1063】秋实大哥与妹纸
寻找a1...an的中位数,即第k大数问题,用堆或快排的折半查找均可。
#include
#include
#include
【UESTC1069】秋实大哥去打工
寻找最大的连续矩形,明显的,最大矩形的高度一定与某个给定的矩形高度相等,所以对于每一个给定的矩形,以ai为高度的连续矩形可以向左右延伸,直到找到aj
#include
#include
#include
【UESTC1070】秋实大哥打游戏
有权并查集,添加一个dis[i]数组表示i节点到f[i]节点的距离,在find中更新f[i]和dis[i]数组,注意读入有坑……最后一行没换行。
#include
#include
#include
【UESTC1073】秋实大哥与线段树
没什么可说的……
#include
#include
#include
【UESTC1074】秋实大哥搞算数
四则表达式计算,栈的基本应用,正统做法是为运算符规定优先级……这里因为没有括号就偷懒了。减法运算转化为加上负数可以使运算简便一些。
#include
#include
#include