Codechef December Cook-off 2017

1. Football Match

坑:忘记考虑n=0

 

2. Beautiful Array

坑:忘记特殊情况的贡献

 

3. Minimum SubArray

题意:给你一个长度为n<=1e5的int数列a[],和一个int整数tar。让你求出元素和至少为tar的最短连续子序列的长度, 若不存在返回-1。

观察:如果数列都是非负数,那么滑动窗口就可以做。现在数列可能有负数,我们就把a[]转化成前缀和prefix[0-n],问题变成找出prefix[]中满足prefix[i+k]-prefix[i] >= d, 最小正整数k。从左向右遍历prefix[],维护一个递增的单调队列,每次遇到prefix[i], 就在单调队列中二分出小于等于prefix[i]-d的最右位置,更新答案。

 

4. Rotate Point

题意:n <= 1e5, 二维平面,有n个int整数点p[], n个角度a[] (a[i] % 90 == 0),表示第i中操作是把一个点关于p[i]逆时针旋转a[i]。2e5个询问,第一种 [l, r] (x, y), 询问按照l, l+1, ..., r的顺序对点(x, y)进行操作,让你输出点最后的横纵左边mod1e9+7;第二种操作,pos, (x, y), angle。表示修改,p[pos] = (x, y), a[pos] = angle。

观察:其实就是一个线段树操作,关于一个点变换可以看作一个矩阵变换,而矩阵变换是由结合律的。然而自己lte了很多次。看到别人代码发现合并两个相邻的操作不需要矩阵乘,其实想想很有道理,矩阵乘法很大一部分时间都浪费在了角度相加。

方法:

https://www.codechef.com/COOK89/problems/ROTPTS/

 

5. Chef and Isomorphic Array

题意:不超过10个testcase,给你一个长度为n<=75e3的数列a[] (a[i] <= n)。2e5个询问,每次要求动态查询数列的两个长度相等的连续子序列所对应的multiset是否同构(isomorphic,比如两个multiset {1, 1, 2, 2, 3}和 {2, 2, 3, 3, 4}是同构的)。

观察:没有想好,大体看了一眼ac的代码,好像是分块/线段树 + hash。每个块大小为75,这样之多1000个块,可以1000*1000的搞。貌似是对与每一个出现次数(1 - n) assign 一个random的value。分块是为了可以快速的求出hash值,比如说询问[l, r]区间,以区间内包含的最大块的hash值为基础,再处理一下边界的值。

方法:

https://www.codechef.com/COOK89/problems/ISOARRAY

posted @ 2017-12-25 07:18  大四开始ACM  阅读(164)  评论(0编辑  收藏  举报