思路讲解
题目说了一堆花里胡哨的,其实意思很简单,就是把你这个点,和所有点(包括你这个点)组成的线段的长度总和就是答案。
那么想要知道这个,我就想到了前缀和。但前缀和的话短的-长的是负值怎么办?可以对前缀和进行分段,具体的,其实就是这段代码。
1 | for(int i=1;i<=N;++i){ |
AC代码
https://codeforces.com/problemset/submission/1857/309735803
1 | // Problem: E. Power of Points |
题目说了一堆花里胡哨的,其实意思很简单,就是把你这个点,和所有点(包括你这个点)组成的线段的长度总和就是答案。
那么想要知道这个,我就想到了前缀和。但前缀和的话短的-长的是负值怎么办?可以对前缀和进行分段,具体的,其实就是这段代码。
1 | for(int i=1;i<=N;++i){ |
https://codeforces.com/problemset/submission/1857/309735803
1 | // Problem: E. Power of Points |
总体思路就是一个贪心,想办法省最多的钱。首先,这一天他没有去,那这钱他是省不了了,因为后面的天他去,肯定省后面的多的钱,前面的天也没法买他,因此,我们把这个人加到que0里(实际是一个栈,这种我应该用deque,代码里是vector)。
然后可以省钱的,必须要给他找个搭档,先在que0里找,再在rem(A[i]==’1’的i的set)里找,找小的(通过删除rem.begin()实现)。
https://codeforces.com/contest/2026/submission/309701489
1 | // Problem: C. Action Figures |
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 |