2017UESTC 数据结构专题题解

专题传送门

A题

线段树水题

代码:http://paste.ubuntu.com/24554391/

B题

参考hdu3911
线段树区间合并

题意:给你长度为n的一串01序列,m次操作。n,m<=10^5。
操作有两种:
0 L R 查询区间【L,R】内最长的连续1的长度。
1 L R 翻转区间【L,R】内的数(0变1,1变0)。
思路:
维护每个区间的最长0或1前缀,最长0或1后缀,最长0或1子序列就行了
代码:http://paste.ubuntu.com/24549469/

C题

参考bzoj 1798
双lazy线段树

这类题目主要在于要维护双lazy的关系
1. 建树时维护区间和,把乘的lazy初始为1.
2. 对于一个节点d乘上一个数c,则把该区间的累加和,乘的lazy,加的lazy都乘上c。
3. 对于一个节点d加上一个数c,则把该区间的区间和加上区间的数的个数乘上c,加的lazy加上c。
4. 上诉所有操作都在模P意义下进行。

代码戳这里

D题

二维偏序+树状数组
思路:先对坐标x排序,然后再用树状数组查询满足条件的y
代码:http://paste.ubuntu.com/24554392/

E题

题意:把b数组改成在a数组中的位置,然后就是逆序对裸题了
代码:http://paste.ubuntu.com/24554404/

F题

题意:01字典树裸题,具体的可以参考这里
代码:http://paste.ubuntu.com/24554424/

G题

参考bzoj 1756
线段树+区间合并

题意:求区间最大子段和,支持单点修改
思路:线段树每个结点维护四个域:msum,lsum,rsum,sum,其中sum为该区间的和,msum为该区间上的最大子段和,lsum为必须包含左端点的最大子段和,rsum为必须包含右端点的最大子段和

代码:http://paste.ubuntu.com/24554386/

H题

参考bzoj3922
暴力+线段树

题意:给出一个序列,支持单点修改,每次查询一个位置成等差数列中所有数的最大值。
思路:等差数列如果公差很大的话,那么整个数列中的数并不会很多;但是如果公差很小,我们就可以用线段树来乱搞。具体方法是对于每个公差维护一个线段树,按照对这个公差取模的值来进行划分。这样询问的时候就在一块了。

代码戳这里

I题

set

思路:用set维护,set中存储的是个pair第一维权值,第二维是第在几个堆里面,第三维是在原序列的下标。
贪心地从前往后扫,每到一个元素,就查找之前的元素中小于等于其的最大的元素//it=Set.lower_bound(pair<{{{x, inf}, inf}>);it–;
如果存在,就将它置为其父亲。如果一个结点已经是两个儿子的父亲了,就不能在set中存在了,就将他删除。如果然后将当前元素插入。
证明是比较显然的,因为对于某个元素,前面各个堆中权值相同的结点都是等价的。

代码:http://paste.ubuntu.com/24554448/

J题

优先队列

huffman二叉树的贪心法,优队维护最小值就行了
代码:http://paste.ubuntu.com/24554435/

K题

并查集

思路:每次删除反过来变成每次合并,然后用并查集搞一下就好了
代码:http://paste.ubuntu.com/24554460/

L题

带权并查集

思路:裸题,参考食物链那题
代码:http://paste.ubuntu.com/24554468/

M题

贪心

思路:每次把最大的数变得尽量的小即可
代码:http://paste.ubuntu.com/24554473/

N题

并查集

题意:给出N个待染色的节点,给出M个约束条件:两个节点相等或相异。
询问是否存在满足条件的二染色方案(01赋值)。

思路:对于每个节点建立对立节点。

约束关系:
A、B相同:使用并查集合并(A、B),合并 (对立A、对立B)
A、B不同:使用并查集合并(A、对立B),合并( B、对立A)
任意节点与其自身对立节点在同一个并查集中:输出NO
否则输出YES

代码:http://paste.ubuntu.com/24554474/

P题

线段树+扫描线

思路:矩阵面积并裸题
代码:http://paste.ubuntu.com/24554537/

Q题

二维树状数组

题意:给定一个初始为0的矩阵, 将一些子矩阵范围里的数取反。
单点询问。
思路:二维树状数组裸题

代码:http://paste.ubuntu.com/24554550/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值