题目难度
orange−orange−yellow−yellow
T1 星战
Pro
判断 x! 是否是 i=1∑xi 的倍数。
Sol
Subtask 1
因为 x 不大,用 __int128 或者高精即可。
Subtask 2
推式子。
用 x! 除以 i=1∑xi,得到 2x(x+1)x!=x+12(x−1)!。
原题转化为 2(x−1)! 是否是 x+1 的倍数。
容易发现,如果 x+1 是合数,就一定有解。然后特判 x+1=2 即可。
时间复杂度 O(Tn)。
Subtask 3
改成质数筛即可。时间复杂度 O(n+T)。
T2 密码锁
Pro
删除最少的数,使得 ai≤k×aj。
Sol
Subtask 1
枚举 l,r,求出区间最大值与最小值,k×min 与 max 的关系即可。
时间复杂度 O(n3)。
Subtask 2
ST 表维护最大值,时间复杂度 O(n2)。
Subtask 3
- 当 k=1 时,求出出现最多的数字次数。
- 当 k=2 时,判断删 1 或者删 2。
- 当 k=3 时,输出 0。
Subtask 4
考虑枚举左端点,二分右端点,时间复杂度 O(nlogn)。
Subtask *
本题还可以双指针等其他做法,时间复杂度 O(nlogn)。
T3 动物园
Pro
每一次拿一排没有拿过的,先手要和最大,后手要和最小,问最后石子个数。
Sol
Subtask 1
求出 linemax1,linemax2,linemin1,linemin2,比较 max{linemax1+linemin2,linemin1+linemax2} 即可。
Subtask 2
取每一行最大值,每一行最小值。记录它们的差。
显然每一行至少拿 minline。显然史莱姆获得的利益为 linemax−linemin。对差值排序即可。
Subtask 3
只需要记录每一行最大值、每一行最小值、差即可。
T4
Sol
Subtask 1
搜索。
Subtask 2
求出最小列车需要修改的值,修改即可。
Subtask 3
假设求出了最小列车需要修改的值,这就变成了一道背包 DP。物品价值 costi,物品重量 ki。求最小价值。模板。
for(int i=1;i<=m;i++)
{
int cost,k,op;
cin>>cost>>k>>op;
if(op==0)
for(int j=0;j<=sum;j++)
f[j]=min(f[j],f[max(0ll,j-k)]+cost);
else
for(int j=sum;j>=0;j--)
f[j]=min(f[j],f[max(0ll,j-k)]+cost);
}