7月7日
知识点: / (考试)
7月8日
知识点:线段树
7月9日
知识点:树状数组
Meaningful 题目:
习题讲解:
1.
列举样例
l=2,r=4:
那么
ans=a2⨁a3⨁a4⨁(a2⨁a3)⨁(a3⨁a4)⨁(a2⨁a3⨁a4)
由于异或具有可加性,所以
ans=a2⨁a3⨁a4⨁a2⨁a3⨁a3⨁a4⨁a2⨁a3⨁a4
又因为两个相同的数相异或为
0,所以
ans=a2⨁a4
再次举例
l=1,r=4:
那么
ans=a1⨁a2⨁a3⨁a4⨁(a1⨁a2)⨁(a2⨁a3)⨁(a3⨁a4)⨁(a1⨁a2⨁a3)⨁(a2⨁a3⨁a4)⨁(a1⨁a2⨁a3⨁a4)=a1⨁a2⨁a3⨁a4⨁a1⨁a2⨁a2⨁a3⨁a3⨁a4⨁a1⨁a2⨁a3⨁a2⨁a3⨁a4⨁a1⨁a2⨁a3⨁a4=a1⨁a3
由此可见,
ans=al+1+al+3+al+5+...
所以用树状数组分别维护奇数和偶数的异或和,每次查询分别判断
l+1 为奇数还是偶数,再分别求异或和即可
7月10日
知识点:单调栈与单调队列
Meaningful 题目:
习题讲解
1.
不难想出使用动态规划,设
fi,j 表示走到第
i 行第
j 列所得的最大分数,于是递推式
fi,j=max(fi−1,k)+ai,j(k∈[j−T,j+T]) 便想到了,但是暴力枚举
i,j,k 达到了
O(n3) , 显然会超时。
这时我们可以用单调队列来存放
i−1 行长度为
2T 的区间中的
fi−1,k的最小值。
2.
首先看到题面
∑i=1n∑j=in(maxi≤k≤jak−mini≤k≤jak)
一个
O(n3) 的暴力解法应该不难想到,但对于
n≤3×105 显然会超时。
我们可以想到,对于每一个点
i,以
i 结尾的子段一定有
i 个,而如果
ai 对于整个答案的最大
/小值有贡献,当仅是
ai 是子段
[k,i](k∈[1,i]) 的最大
/小值。
于是我们可以对于每一个
i, 维护它左侧第一个大于等于
/小于等于
ai 的数,设
fi/gi 分别表示 以
i 结尾的子段最大
/小值的和,初始设
f,g 数组分别为正无穷,负无穷,那么如果
fi=0,则
i 对最大值的贡献
fi=ai∗i,否则
fi=fk+(i−k)∗ai(k 为第一个
ak 大于等于
ai 的位置
) ,
g 数组同理。
但是我们发现暴力枚举
i,k 还是会超时,于是我们用两个单调栈分别维护,时间复杂度为
O(n)
7月11日
知识点:DP
7月12日
知识点:/ (考试)
Meaningful 题目:
习题讲解:
1.
对于这道题,我们可以用
O(n2) 的做法加上特殊性质骗到
50 分,但对于所有的数据显然过不了。
我们可以使用线段树来记录每一个数在区间
[l,r] 中最后一次出现的位置,每次查询再用线段树二分找到答案,时间复杂度约为
O((n+m)log2n)
但是线段树的代码十分繁琐,于是我们可以用
莫队,这是一种对于询问答案的一种奇妙做法,首先将所有询问离线下来,然后分为
n 块,按分块来排序,如果在同一块内就按左端点排序,排完序后就分别处理,处理过程为:
设相邻两个查询分别为
[l1,r1],[l2,r2],那么莫队的方法就是先将
r1 加到
r2,再计算加的贡献值,在将
l1 变为
l2,增加它们的贡献。在本题中,对于加上的数
ai ,如果在区间内没有
ai,那么区间和
ai 本身都
++,删除同理。最后时间复杂度约为
O(n⋅n)
7月14日
知识点:贪心,二分,三分
Meaningful 题目
习题讲解:
1.
不难发现,对于每一位
i 和
i−1,就算我们不选第
i 位,其余从
i−1 位后都选,那么总和
sum1=2i,sum2=2i−1+2i−2+...=2i−1,于是我们就可以用这个特性进行贪心,从大到小枚举二进制位的第
i 位,如果这一位是
1 的数超过
2 个,我们就将其他数删除,重复此操作,最终答案一定是
a1&a2
2.
容易发现优美度具有单调性:优美度越高,需要改变的数就越少,反之亦然。于是我们使用二分来做。
首先先特判是否在
k 次内可以转为优美度为
1,具体地,设
p=si!=cimod2,(c∈[N,F]),如果
p≤k 或
(n−p)≤k,那么最小优美度一定为
1。
然后我们就开始二分,判断的
check 函数分别从
1 扫到
n,如果连续的子段长度大于了二分的优美度,记录的答案
ans 便加一,最后判断
ans 是否小于等于
k 即可。
3.
这道题可以转化为:给定一些圆的圆心坐标和矩阵大小,问这些圆最大的半径并且使得可以从
(1,1) 走到
(n,m)。
但一个半径使得走不到是,只有当
(1,1),(n,m) 都被圆所构成的集合包含,并且互相连通时,于是我们就可以二分圆的半径,再用
O(n2) 的暴力算法分别枚举两个圆是否有交集,最后看圆是否与
(1,1),(n,m) 有交集,如果最后
(1,1),(n,m) 连通,则此次就不行,反之就可以。
4.
观察式子
ci=⎩⎨⎧a1+b1max{ci−1,j=1∑iaj}+bi,i=1,2≤i≤n
可以发现,
ci 一直在递增,因为
ci+1 无论如何都要大于等于
ci,所以根据贪心的邻项交换法,我们就可以推导出排序的方法。
设
i 和
j 为要交换的两个数,
x 为
∑k=1k<iak,
y 为
ci−1, 那么在交换前,这两个数的最大值为:
max(ci,x+ai+aj)+bj=max(max(y,x+ai)+bi+bj,x+ai+aj+bj)=max(max(x+bi+bj+ai,y+bi+bj),x+ai+aj+bj)=max(x+bi+bj+ai,y+bi+bj,x+ai+aj+bj)
同理,在交换后,这两个数的最大值为:
max(cj,x+ai+aj)+bi=max(max(y,x+aj)+bi+bj,x+ai+aj+bi)=max(x+aj+bi+bj,y+bi+bj,x+ai+aj+bi)
若要使交换前的最大值小于交换后,当仅
max(x+bi+bj+ai,x+ai+aj+bj)<max(x+bi+bj+aj,x+ai+aj+bi)
∴max(bi,aj)+x+bj+ai<max(bj,ai)+x+bi+aj
∴max(bi,aj)<max(bj,ai)+bi−bj+aj−ai
∴max(bi,aj)<max(bj+bi−bj+aj−ai,ai+bi−bj+aj−ai)
∴max(bi,aj)<max(bi+aj−ai,bi−bj+aj)
∴max(bi,aj)<max(−ai,−bj)+bi+aj
∴max(bi,aj)−bi−aj<−min(ai,bj)
∴max(−aj,−bi)<−min(ai,bj)
∴−min(aj,bi)<−min(ai,bj)
∴min(aj,bi)>min(ai,bj)
所以我们就用这个式子来排序,但是需要注意:如果
min(aj,bi)==min(ai,bj),那么我们需要用
ai,
aj 的大小来排序,因为此时再用
min(aj,bi)>min(ai,bj) 来排序会不符合排序的四大特性。
7月15日
知识点:搜索
Meaningful 题目
习题讲解:
1.
首先看题,发现操作数最多不超过
5 次,于是就能想到迭代加深搜索加启发式搜索
IDA∗,
7月16日
知识点:/ (考试)
Meaningful 题目:
7月17日
知识点:最短路& 最小生成树
Meaningful 题目:
7月18日
知识点:并查集&拓扑序&强连通分量
Meaninful 题目: