思路讲解
ABC - 370 - E - Avoid K Partition
这种子序列的问题,无论是dp还是构造,抓手就是以下标i为结尾的子序列。
以这个结构单元来分析,不重不漏,一点一点的来。
AC代码
https://codeforces.com/problemset/submission/1809/309628591
1 | // Problem: C. Sum on Subarrays |
ABC - 370 - E - Avoid K Partition
这种子序列的问题,无论是dp还是构造,抓手就是以下标i为结尾的子序列。
以这个结构单元来分析,不重不漏,一点一点的来。
https://codeforces.com/problemset/submission/1809/309628591
1 | // Problem: C. Sum on Subarrays |
哈哈,其实说起来也简单,在xor中,加上这个数和减去这个数都是xor,因此对区间进行反转操作,就是对这个区间进行异或就可以了,不用区分是加上还是减去。
当然,怎么对区间进行异或那?其实也很简单,异或前缀和。
https://codeforces.com/problemset/submission/1872/309601127
1 | // Problem: E. Data Structures Fan |
最长上升子序列询问版,还有最大值限制。
不过确实LIS的dp做法我确实没学过,那个贪心做法倒是学过的。
贪心做法总结来说就是利用一个数组,既保留长度信息,也保留位置最低数信息,进而避免使用多个数组导致时间复杂度上升。具体可以参见下面的leetcode题解。
然后有了这个贪心方法,再加上离线trick即可,就能求出答案。处理到哪里,就把所有和i相关的询问(R==i)给处理掉。
当然,需要小心,这道题目还要求严格递增,不过也简单,把upper_bound换成lower_bound即可
https://atcoder.jp/contests/abc393/submissions/63583196
1 | // Problem: F - Prefix LIS Query |
https://atcoder.jp/contests/abc393/submissions/63582964
有点招笑了,样例竟然会RE?这在我电脑上跑的好好的,只能说C++经典咏流传了。
搞半天原来是while的问题,要加一个tot≤Q
1 | while(query[tot][0]<=i && tot<=Q){ |
和这道题比较类似吧,都是GCD,而且都要枚举。
其实思路都是差不多的,就是类似于埃氏筛的枚举方法,可以将时间复杂度降至O(nlogn)左右。
具体而言,我们讲解一下下面这段程序。i其实是在枚举divisor(也就是除数,答案),j就是在枚举能被这个divisor整除的数。如果我们发现所有能够被整除的数在A中出现了K次及以上,就对这其中所有的数都更新答案为K。
1 | for(int i=1;i<=M;++i){ |
https://atcoder.jp/contests/abc393/submissions/63486992
1 | // Problem: E - GCD of Subset |