DAY01 主要进行了普及组复赛知识点的复习。除此之外,还学习了提高组初赛的知识点:ST表。
普及组复赛知识点:结构体排序,前缀和&差分,双指针和二分(查找与答案)。
这里主要总结二维前缀和,双指针和二分。
一. 二维前缀和
定义:s[i][j]s[i][j]s[i][j]表示以(1,1)(1,1)(1,1)为左上角,以(i,j)(i,j)(i,j)为右下角的矩阵和。
二位前缀和主要有两个重要的部分:
1.s[i][j]s[i][j]s[i][j]的计算:
从此图可得知:是s[i][]j]=s[i−1][j]+s[i][j−1]−s[i−1][j−1]+a[i][j]s[i][]j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j]s[i][]j]=s[i−1][j]+s[i][j−1]−s[i−1][j−1]+a[i][j]
2.从左上角(x1,y1)(x1,y1)(x1,y1)到右下角(x2,y2)(x2,y2)(x2,y2)的矩阵和计算。
从此图可知:ANS=s[x2][y2]−s[x2][y1−1]−s[x1−1][y2]+s[x1−1][y1−1]ANS=s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1]ANS=s[x2][y2]−s[x2][y1−1]−s[x1−1][y2]+s[x1−1][y1−1]
二.二分
这是一个很玄学的东西,需要凭感觉。
相关题目1:题1 这道题目属于二分查找。
有三种普遍做法:
1.最简洁的版本:
使用了一个lower_bound()函数。
2.通用的初学版本:
3.比赛时使用的高级版本:
其实在while停止后,变量是处在一个l=rl=rl=r的状态的。
又知rrr一定大于等于xxx。
所以可以直接输出lll。
二分答案:
相关题目:题目二
三.ST表
只是模板。
四.考试题目
题目一:区间
此题是二分答案。考试时没做出来的原因:对于二分题目接触过少。
总结:可以少学一点,多练一点。
判断二分的原因:首先n∗k≤1e10n*k\le1e10n∗k≤1e10,满足条件。
其次,数组bbb中适合的起始位置lll大概是这样分布的:000000000011111111000000000011111111000000000011111111 (其中0为适合的起始位置,1为不适合的起始位置)。
那么就可以二分查找一下第一个1。
然后下标减1即最后一个0。
然后check()里面添一点东西即可。
注:向上取整:
1.int ans=(m-n+1)/n;
2.int ans=ceil(m/n);
代码:
题目二:排列缺失
此题除了用到一点前缀和外,难点集中在读懂题目和理清思路上。
思路大概是这样的:
以第二个样例为例,可以画一个图:
五.每日拓展
今天的T4是返回贪心的题目。
题目:链接描述
个人认为返回贪心只要想到了就不难。
在认为有点像DP但又不会写DP时,可以考虑返回贪心。
但是对于此题根本就没有返回贪心的想法。
个人认为也是因为做的太少了,还是得多练。