ABC223
ABC223
A
签到
B
签到
C
有\(n\)个串联的保险丝,第\(i\)根长度为\(a_i\),燃烧速度为\(b_i/s\)
从左右两端同时点燃,求在哪个位置相遇
解:
预处理出从前面烧完第\(i\)个,从后面烧完第\(j\)个的时间
找到在哪里碰头,然后模拟一下
D
在\(1\sim n\)的所有排列中,找到字典序最小的满足:\(a_i\)出现时间早于\(b_i\)的排列
解:
开优先队列,把所有没有入度的点都丢进去,每次取最小
E
\(n*m\)的矩形中能否不重叠地、与边平行地放置三个面积为\(A,B,C\)的矩形。
解:
先考虑只有两个矩形的情况:
肯定可以用一条平行于坐标轴的直线将两个矩阵分到两个互不相交的部分
一般地认为这条直线平行于\(y\)轴
只要让第一个矩形的高最大,让第一条直线贴着第一个矩形放置,判断第二个矩形能否放入右侧区域
推广到三个矩阵,同样可以证明,至少有一条平行于坐标轴的直线将三个矩阵划分到两个不相交的区域,其中一个区域有三个矩阵,一个区域有两个矩阵
枚举被划分出的一个矩阵,判断另一部分区域能否放入两个矩阵
F
给定一段括号序列
操作一:交换两个位置上的括号
操作二:查询一段区间是否是合法区间
解:
设左括号为\(+1\),右括号为\(-1\),考虑一段区间是合法的充要条件:
(1)区间和为\(0\)
(2)区间前缀和最小值为\(0\)
这两个信息分别可以用线段树维护,对前缀和数组建一颗线段树
然后考虑修改操作,交换两个位置的括号
(1)如果两个位置括号的一样的,忽略这个操作
(2)如果左边是左括号,右边是右括号,那么交换后\([l,r-1]\)位置的所有前缀和全部\(-2\)
(3)如果左边是右括号,右边是左括号,那么交换后\([l,r-1]\)位置的所有前缀和全部\(+2\)
判断时求出左右端点的前缀和的值和区间最小值,判断左右端点前缀和值是否相等,区间最小值是否等于左端点前缀和的值
G
一颗有\(n\)个顶点的树,求删除哪些点最大匹配数不变
解:
根据二匹配对树进行黑白染色,当一个节点没有子节点是白色时染成白色,有子节点是白色时染成黑色
对于根节点来说,如果它是白色的,那么它可以被去掉
然后换根\(dp\)
如果一个根节点是黑色的,它将要进入的节点是白色的,并且所有和它相邻的点中仅有一个白色节点,那么交换根节点和将要进入节点的颜色
H
给定序列\(A_i\),求在\([L_i,R_i]\)中是否可以选择任意多个元素使得异或和为\(X_i\)
解:
线性基,经典的区间按右端点排序
记录\(id[i]\)表示插入到第\(i\)位的线性基是在哪个位置被插入的
插入第\(i\)个元素时,如果线性基第\(j\)位已经有元素了,并且\(id[j]<i\),那么交换\(id[j],i\)和\(p[j],a[i]\),然后继续向低位插入
这样可以保证线性基每一位上的元素最靠后
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步