这是一个好东西->作者主页
T1 整除
题目大意:
给出n个数a1,a2……an,求区间[L,R]中有多少个整数不能被其中任何一个数整除。
思路:
- 暴力查询[L,R]的区间,然后判断,30分
- 利用容斥原理,判断最小公倍数,将[1,R]和[1,L-1]的值相减得出答案,100分
T2 新壳栈
题目大意:给定一个栈,可以支持压入、弹出和翻转的操作,求每一次弹出的值。
思路:其实这一题我都没想到是暴力出奇迹……
直接模拟每一次操作,注意用
s
c
a
n
f
scanf
scanf就行了。
T3 铺砖问题
题目大意:求用
1
×
2
1×2
1×2的砖块铺满
n
×
m
n×m
n×m的格子图的方案数
m
o
d
mod
mod
1
0
9
+
7
10^9+7
109+7。
思路:
- 搜索每一个点放什么样的砖块,20分
- 状态压缩 d p dp dp,设 d p i , S dp_{i,S} dpi,S表示前 i − 1 i-1 i−1行已经填满,第 i i i行还有一些空位,状态为 S S S,那么通过搜索可以推出公式,50分
- 状态压缩加矩阵乘法, f n , ( 1 , 2 , . . . , 2 m − 1 ) = f 1 , ( 1 , 2 , . . . , 2 m − 1 ) × C n f_{n,(1,2,...,2^m-1)}=f_{1,(1,2,...,2^m-1)}×C^{n} fn,(1,2,...,2m−1)=f1,(1,2,...,2m−1)×Cn ,如果 f i , S f_{i,S} fi,S能从 f i − 1 , T f_{i-1,T} fi−1,T转移过来,那么 C S , T C_{S,T} CS,T等于1
T4 偷懒的西西
题目大意:有
n
n
n个数,让你取出任意数,保证取出的数的和不大于
t
t
t。定义
G
G
G为剩下的数的连续段的最长长度,那么输出所有取法中最小的
G
G
G。
思路:
- 二分枚举 G G G,每次做一次 d p dp dp,动态规划时间复杂度 n 2 n^2 n2,60分
- 在1的基础上把动态规划的第二层循环优化掉,可以用单调队列或者线段树,100分
提示:
- 设 d p i dp_{i} dpi表示取了 a i a_i ai后,前面都满足的情况下的最小和。
- 枚举 j j j, i − m i d − 1 ≤ j < i i-mid-1≤j<i i−mid−1≤j<i, d p i = m i n ( d p i , d p j + a i ) dp_i=min(dp_i,dp_j+a_i) dpi=min(dpi,dpj+ai)
- 因为第二层循环是枚举区间最小值,所以可以用线段树
完成情况
- T1
- T2
- T3
- T4