ABC457
比赛时写到D题,比赛后补完了,记录一下第一次补完,以及第一次写题解
A
题意
给你一个序列A,和下标x, 问第x个元素是多少
思路
直接输出Ax,注意下标从1开始
代码
1 | void solve() |
B
题意
给你N个长度不一样的序列A,和下标x,y,问Ax,y是多少
思路
使用vector的动态数组,注意x和y下标都从1开始
代码
1 | void solve() |
C
题意
给你N个长度不一样的序列A,Ai的长度为Li,和一个一维数组C,然后将Ci个Ai放入B中,问Bk的值
思路
枚举找到k在哪一个Ai上,然后输出。注意下标k是从0开始的
代码
1 | void solve() |
D
题意
给一个序列A,可以进行k次操作,每次可以给Ai加上i(下标从1开始),问最大的A中最小值是多少
思路
既然要最大的最小值,那肯定k次要都使用完,每次选择最小值加不就好了,于是我想到优先队列,正准备开始写,看了一下k的范围1e18??!
好的,思路完全偏了,最大的最小值,噢!二分啊
二分答案,如果答案是mid的时候,cnt(操作的数量)<=k,说明这个答案是可以的,继续寻找更大的答案
r的初始值需要设置一个极大的值,我刚开始想着r不会超过A中最小值的ki,但是可能数值太大,longlong也会爆,导致wa了
代码
1 | int n; |
E
题意
给你m块布,每条覆盖了Li到Ri。进行q次查询,是否可以从 M 块布中恰好选择两块布,使得Si到Ti至少有一条布覆盖,其他单元格没有被任何布覆盖
思路
只能覆盖Si到Ti,那么两条布一个左端点在Si,一个右端点在Ti。然后我们在左端点在Si的布里面寻找R<=Ti的,右端点在Ti的布里面寻找L>=Si的,因为Si到Ti里面都需要布覆盖,那我们在R中要寻找max,在L中寻找min,然后判断R>=L-1
如果找到的L=Si,R=Ti,有可能是一个布
此时我们需要在寻找一个布,分为4个情况
1.l = L,r = R
2.l = L,r< R
3.l > L, r = R
4.l > L, r < R
对于1,我们直接使用map来计数相同的布的个数
对于2,我们可以在左端点在Si的布中直接寻找最小的r,判断r < R
相同的,对于3,我们可以在右端点在Ti的布中直接寻找最大的l,判断l > L
对于4,我们可以使用一个数组Right,Right[i]表示以i开始的最小r的值,然后判断Right[L+1] < R
代码
1 | const int N=2e5+5,inf=0x3f3f3f3f; |
F
题意
给定一个长度为 N−1 的序列 D,构造一个 P,使得对于每一个 1≤i≤N−1,在后缀 Pi…PN 中,最大值和次大值的下标差的绝对值等于 Di,求满足条件的P数量。
思路
我们可以从后往前推,相当于每次在前面加一个Pi
假设在后缀Pi+1...PN中,最大值下标为x,次大值下标为y,|x-y|=Di+1
现在我们加入Pi,有3种可能性
1.Pi变成最大值,那次大值下标就是x,那么|i-x|=Di
2.Pi变成次大值,那最大值不变还是x,那么|x-i|=Di
3.Pi不是最大值也不是次大值,此时因为x,y不变,推出Di=Di+1
Pi的取值可以在N-i-1中选择
由上面3种情况可以推出状态其实和次大值的位置没有关系,我们假设f[i][j]
表示在后缀Pi...PN中,最大值的下标为j的数量
状态转移
如果Di=Di+1
f[i][j]+=f[i+1][j]×(N−i−1) (对应3)
如果j-i=Di
f[i][i]+=f[i+1][j] (对应1)
f[i][j]+=f[i+1][j] (对应2)
但是现在的时间复杂度是O(N2) TLE
我们需要优化!!!
可以使用线段树优化
1.区间乘法:当 D[i] = D[i+1] 时,将区间 [i+1, n] 的值全部乘以 (n - i - 1)
2.单点修改:处理2,3的时候,更新f[i]
3.单点查询: 获取f[i]
代码
1 | typedef long long ll; |
G
题意
有 N个苹果,第 i个苹果会在时间 Ti掉落在 Xi 处,可以在任意位置放机器人,机器人从 0 时刻开始移动,速度不大于1,每个机器人同一时刻只能吃一个苹果,求最少需要多少个机器人,才能吃完全部苹果。
思路
假设一个机器人在Ti的时候吃了Xi位置上的苹果,现在要去Tj时间Xi位置上的苹果,由于速度<=1,
可以推出∣Xi−Xj∣<=Tj−Ti
拆开整理一下得出
1.Ti+Xi<=Tj+Xj
2.Ti−Xi<=Tj−Xj
然后我们令 A=T-X,B=T+X
得出 Ai<=Aj &&Bi<=Bj 的时候,机器人可以从i到j吃到苹果
题目问我们最少需要但是机器人才可以吃完苹果 那么就变成了求最长严格递减子序列的问题
我们需要先对A排序,然后对B进行求解
代码
1 | typedef long long ll; |
