Manthan, Codefest 19

  为了csp,试着补了一场cf

  发现半年不打cf,还真有点不会做了。。。

  不过这次的题都还蛮有意思的hhh

  

B:

  题意就是给出一个数组,你需要从中取出一段连续的数字,使剩下的数字中没有重复的数字,需要使取出来的这段数字最小化

  n<2000

  很容易有一个想法,就是要枚举取出的这个线段,但是问题在于如何快速的维护剩下的数字中是否有重复的

  直接暴力的话,时间复杂度至少是n^3,但是期望时间复杂度是n^2

  思考一下,枚举的线段其实是固定起点,然后终点不断向右移动,那么就可以利用之前的信息

  维护一下有多少个重复的数字,在枚举过程中不断更新去掉的数字,这样就可以知道是否剩下的数字中有重复的了

  由于a_i<1e9,需要进行离散化

 

C:

  题意是给出n(保证是4的倍数),需要把0~n^2-1填入到n*n的矩阵中,使得矩阵的每一行和每一列的异或和相等

  n<1000

  这是一道构造题,开始会很没有方向,因为异或和不是给定的,而且也没有好的构造方案

  试着考虑是否可以使每行和每列的异或和为0

  同时保证n是4的倍数,那么这个大的矩阵,就可以被分成四个相等的小矩阵(左上、右上、左下、右下)

  每个小矩阵都按顺序填入0~(n/2)^2-1,那么这个大的矩阵的每行和每列的异或和就都是0了

  但是要求是不能相同,那么考虑把每个数字乘4,然后每个小矩阵里的每个数统一加上0、1、2、3,这个每行每列的异或和就还是0

 

D:

  题意是有一个全排列s,但是我们不知道,只给出一个辅助数组p,p数组中第i个数表示:在给定的全排列s中,在s_i之前的比s_i小的数字和,要求根据p数组求出这个全排列

  n<2e5

  看完题意之后发现这个题的暴力做法很好想,因为全排列中一个数字只会对它后面比它大的数字产生影响,那么p数组中的最后一个0一定是全排列中最小的数字1,然后我们将1之后的数字全部减1,p数组剩下的数字中,最后一个0就一定是全排列中的2了,不断进行这样的操作,就可以把全排列求出来了。

  但是时间复杂度是n^2,期望的时间复杂度应该至少是nlogn的

  考虑一下,在p数组中做减法,其实就是一个区间减,查询的时候就是查询区间最小值,并且得到位置

  实际上就是带懒惰标记的线段树

  维护一下区间最小值,每次做一个区间减,魔改一下区间查询最小值就好了

  (忘了开ll挂了好几发。。。

 

E:

  题意就是在一个n*w的矩阵中,有n条长度小于等于w的数组,可以自由滑动,求出每一列可能得到的最大和

  n,w<1e6,保证所有数组的长度和不超过1e6

  开始想的是,对于每一列我们都可以确定出它可以取每个数组的哪一段,然后用线段树搞个区间最大值什么的就好了

  但是这个数据范围会炸

  然后又想了一下,把数组中的数字从小到大排序,按顺序覆盖,那么就好了,然后就是区间赋值+区间加,但是似乎还是会炸。。。

  先挖个坑hhh

posted @ 2019-09-04 23:21  HTWX  阅读(...)  评论(... 编辑 收藏