A. Magic Mirror
按照题意模拟即可。
A题代码
https://paste.ubuntu.com/p/pTcD94cpRD/
I. Save the Room
类比到二维平面,若一个矩形想被1*2的矩形填满,长宽至少有一个为偶数
I题代码
https://paste.ubuntu.com/p/wcnrzKSXN9/
于是这道题就转换为当n很大的时候求 2n−1 2 n − 1 , 我们只需要用欧拉降幂公式对 n−1 n − 1 进行降幂即可
G题代码
https://paste.ubuntu.com/p/2qYPS24vcB/
L. Poor God Water
根据题意可以暴力打出前20项,然后丢进BM就可以得到递推式
f[i]=2∗f[i−1]−1∗f[i−2]+3∗f[i−3]+2∗f[i−4]
f
[
i
]
=
2
∗
f
[
i
−
1
]
−
1
∗
f
[
i
−
2
]
+
3
∗
f
[
i
−
3
]
+
2
∗
f
[
i
−
4
]
没有BM的话可以手推9*9的转移矩阵或者在AC自动机上跑出转移矩阵。
L题代码
https://paste.ubuntu.com/p/3wBgtFbSNz/
K. Transport Ship
题意就是给你
n
n
种物品,第种物品有
2c[i]−1
2
c
[
i
]
−
1
个,每个所占容量为
v[i]
v
[
i
]
,求凑出容量为S的方案总数
我们知道多重背包可以二进制优化,而且这道题已经给出二进制最大值是多少,那么就是所有小于C的2次幂进行01背包,转移的时候就是正常01背包的转移,只不过不是取像求最大价值时一样取max,而是直接加上可以转移过来的方案数。
K题代码
https://paste.ubuntu.com/p/VwcWJZ8XVT/
B. Mathematical Curse
题意就是给你一串运算符和一个初始值,你要按顺序使用这些运算符与一个序列中的数进行运算,序列中数的个数大于运算符的个数,要按先后顺序使用这些数而运算符,当然也可以选择不用某个数,但最后一定要把所有运算符用光。
我们用dp[i][j]表示到达第i个位置是使用j个运算符所能达到的最大值,然后就可以n*m进行转移,但是这道题过程中会出现负数,如果一个负数进行乘法,很明显我们应该用更小的负数去乘负数才能得到一个更大的数,所以我们只要开两个dp数组,一个保存最小值,一个保存最大值,乘法和除法的时候分别互相进行转移就可以了。
B题代码
https://paste.ubuntu.com/p/fZsybckMHd/
J. Participate in E-sports
题意简化之后就是分别判断n和n*(n-1)/2是否为完全平方数,但这里n很大,为了保证精度要java手写二分。而且我们发现满足第二种情况的完全平方数不太多,而且具有递推式,为了卡时间我们就可以二分判断n,打表判断n*(n-1)/2
J题代码
https://paste.ubuntu.com/p/ynSWTxb5Mf/
H. String and Times
题意就是求一个字符串内出现次数大于等于a,小于等于b,的子串个数。
SAM可以求出一个字符串出现任意次数的子串个数,所以就是裸裸的SAM模板题。
H题代码
https://paste.ubuntu.com/p/YzCVq6MWJp/
F. Modular Production Line
区间K覆盖模型,用费用流解.只是这题
N
N
可达,需要将点离散化.(网络流复杂度
o(v2E)
o
(
v
2
E
)
)
建模方式步骤:
1.对权值为
w
w
的区间,加边
id(u)−>id(v+1)
i
d
(
u
)
−
>
i
d
(
v
+
1
)
,容量为1,费用为-w;
这样最后的结果取反就是最大值
2.对所有相邻的点(离散化之后的点)加边
id(i)−>id(i+1)
i
d
(
i
)
−
>
i
d
(
i
+
1
)
,容量为正无穷,费用为
0
0
;
3.建立源点汇点,由源点s向最左侧的点加边,容量为K,费用为0,由最右侧的点向汇点加边,容量为K,费用为
4.对于这种涉及到点覆盖的问题,单个点有使用次数,一般需要
u−>(v+1)
u
−
>
(
v
+
1
)
建边,这样能够避免区间点重合
5.跑出最大流后,最小费用取绝对值就是能获得的最大权
F题代码
https://paste.ubuntu.com/p/35krW6bdXN/