1.10-1.16题目总结

1.10-1.16题目总结

位运算

这种题挺明显的,题目中一般有明确的运算方式,要做的一般就是找规律
经典例题:
A r r a y    E l i m i n a t i o n Array\;Elimination ArrayElimination(简化一下就是按位异或,那么写出每个数的二进制,发现不管怎么异或,当一位已经是0的情况下,你一直让这几个数异或,这一位都是0,没影响,于是就一位一位来搞,找到每个位置上的1的个数,取个最大公因数,则它里面的因子都能作为一组选择,这样选择之后,一定能把每个位置上的1恰好变为0)

并查集优化时间

在进行暴力遍历的时候,可能会遍历到一个点多次,不需要,用一个bool数组标记直接跳过,但是还是会遍历到,复杂度依然很高,这时候就能用并查集了!把这些已经遍历过的点全部合并,之后就遍历不到它了,复杂度大大降低!【滑稽】
经典例题:
F r o g    T r a v e l e r Frog\;Traveler FrogTraveler(对于每一个位置,青蛙可能会有多种方式跳到,因为要求的是到达地面的最小天数,如果之前已经跳过了,再跳到相同的位置会浪费天数,所以,第一次是最优的,后面就不管这个点了,于是我们使用并查集,在跳过之后把它并掉就ok了)
清扫积雪 (上题是线性,这个上树了,但是他们的路线是固定的,依然是线性的,值得注意的是,题目中给的是bfs序,求LCA的时候不用再默板子了)

分治

类似于线段树的操作,处理一个区间的时候,把他分成两部分,每部分再按同样的方式进行处理(但是感觉没啥特征)
O p t i m a l    I n s e r t i o n Optimal\;Insertion OptimalInsertion(首先把b排序,能保证,对于b来说,贡献是0,逆序对最小,接着考虑b插入的顺序,找到b[mid],判断哪里逆序对最少,插进去后,a,b两个区间都被分成了两部分。mid前的数只能再往前面插,这样处理,时间复杂度就变成log了)
T h e    N u m b e r    o f    S u b p e r m u t a t i o n s The\;Number \;of \;Subpermutations TheNumberofSubpermutations(求排列的个数。可以从整段区间的最大值写起。找到最大值,这个可能的排列的长度就确定了,剩下的就是判断是否合法。当这个最大值处理完之后,剩下的排列都不能包含它了,所以就把区间分成两部分,然后重复操作。)
(但是判断是否合法的过程又很费时间,所以我用一个数组wz,记录有相同的值最靠近它出现的位置,比如1 2 2 1,的数组就是 0 0 2 2。枚举端点,如果wz[r]<l,说明在这一段区间内是没有相同的数字的,又因为我们当前考虑的是这段区间的最大值,所以这段区间内的数都是<=这个数,且不重复的,因此构成了一个排列)这点技巧可以掌握一下

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值