ysz2009
2022-10-05 14:45:02
题过于毒瘤,本以为换了个出题人能好些,结果还是一样崩。
无论题是什么分的,都是做不出来的题
你有一个长度为
n 的数组a ,你需要构造一个长度为n 的数组b ,使得a 中每一个元素都能由b 中两个位置不同的元素相加得到.n\le 10^5,a_i\le 10^9
好神奇
特判
如果有一个偶数一定可以:考虑我们只要构造出
于是考虑全是奇数的情况:我们考虑如果最终答案
所以现在要判断是否有两个这样的东西了,众所周知subset sum指数,要点在于当
太脑洞了构造题.
一个塔防游戏:给定一个无限长的数轴,一个无限血的敌人要从正无穷走到负无穷.你的任务是放置三种塔,包含两种攻击塔和一种寒冰塔,使得敌人受到的伤害最大.
其中,每种塔的攻击半径可能不同,每种攻击塔的攻击力也可能不同.而寒冰塔没有攻击力,它的作用是使范围内敌人的速度减速,即一段区间若有
k 个寒冰塔覆盖,敌人速度变为\frac{1}{k+1} .同一个位置只能放两个塔.敌人初始速度为1格每秒,攻击塔的伤害值也是以秒计算的.
三种塔数量总和不超过20.
首先体会一下如果没有一个位置只能放俩的性质,最好的方案是全部堆到一个点上.由这个大概可以想到,最终局面是堆在一起的一排,长度最大为
然后发现安排位置好困难,根本不会,看题解,啥?塔只有20个?/qd
直接枚举冰塔的方案(每个位置放0/1/2个),方案是
现在有一些空位,可以求出每个位置放每种塔的伤害.
此时还不能直接从高往低放...暴力dp它,
我们的问题在于
那么这样dp,省掉一维,然后再枚举前面最长的一段放了多少即可.用set从后往前扫一遍即可.
看一眼另一篇题解,猜完连续的结论后直接模拟退火///jy///jy///jy
对所有
k\in [1\ldots n] 求出{1\ldots n} 的大小为k 的子集中最小的值,一个子集的值为这个子集的任选两个不同的数a,b 的\gcd 的最大值.n\le 5\times 10^5
给定数轴上
n 个点和m ,要再建立若干点,使得存在一条路径a_1\ldots a_n 的\sum {(a_i-a_{i-1})}^2\le m .求最少再建几个点.n\le 2\times 10^5,a_i\le 10^9
好像是咱们上面那个 Teleporters 啊.凸的-二分就做完了.
给定
1\ldots n 每个数的个数a ,每次给一个区间个数减1或对一个数减去任意,求清空次数.n\le 5000, a_i\le 10^9
给定一个字符串,可以任意多次删掉末尾字符或者把当前字符串复制一份接在后面,求能得到的字典序最小的,长度恰好为
k 的字符串.n,k\le 5000
给一个
n\times m 黑白两色的网格图,要全染白,每次把一个连续颜色块反色,求最少次数.n,m\le 50
给定序列
a_{1\ldots n} 和由\texttt{LR} 组成的长n 字符串S ,两个集合L,R 初始为空,要求给一个方案使得我们第i 次选择一个数添加进去后集合S_i 更大.n\le 2\times 10^5,a_i\le 10^9
给定平面上
n 个点和\texttt{LR} 构成的长n-2 的字符串,求一条不自交路径经过每一个点一次,且第i+1 个点是在i-1 到i 的基础上往s_i (左或右)的方向拐的.n\le 2000
山的初始攀登难度为 $d$ . 每位登山者有两个属性:技巧 $s$ 和整洁度 $a$ . 技巧为 $s$ 的登山者能登上攀登难度为 $p$ 的山当且仅当 $p\leq s$ . 在一位整洁度为 $a$ 的登山者登上攀登难度为 $p$ 的山后,山的攀登难度会变为 $\max(p,a)$ . 请给这些登山者指定一个爬山的先后顺序,最大化登上山的人数. 如果轮到一位登山者时他能登上山,则他一定会选择登山. $n\le 5\times 10^5,d,s_i,a_i\le 10^9
简单题
在游戏中,有
n 个排列在环上的房间,第i 个房间只能到达第i+1 个房间(特别地,第n 个房间只能到达第1 个房间).同时有
n 个宝箱,第i 个宝箱的价值是c_i ,其中恰好有k 个宝箱是假宝箱,其余均为真宝箱,每个房间有且仅放置一个宝箱.玩家等概率地从
n 个房间中选取一个房间开始移动,如果当前房间有真宝箱,他将获得此宝箱的价值,否则立刻结束游戏.最后获得的总收益等于之前收集的宝箱的总价值.对于每一个
k\in[1,n] ,你可以决定宝箱的排列顺序和宝箱的真假,使玩家收益的期望值最小,请求出最小的期望值\pmod {998244353} .n\le 3\times 10^5
给定常数
c 和n 个整数,每个数只能用一次,求加到c 的一个方案.求法是每次选择不超过c 的最大的加进去,那么现在让你再添加任意多个数hack它,或者判断hack不掉,最小化添加的数的和.n,c\le 2\times 10^5
给定一个括号序列,每次可以翻转一个区间,求最少的操作次数使得括号串合法.保证左右括号数量相等.
n\le 2\times 10^5
给定长度为
n 的01串s ,构造一个排列使得s_{p_i}\ne s_{p_{i+1}} ,最小化排列的逆序对个数,输出方案.n\le 10^5
给定
\texttt{J},\texttt{O},\texttt{I} 三个字母组成的字符串S ,从中拿出若干的不交的\texttt{JOI} 和,\texttt{IOI} 子序列,最大化拿的数量总和. 不交是指不能选同一个字符两遍,但IIOOII 这种是可以取出来两个的,就是说可以跨越.\vert S\vert \le 10^6
给定一个长
n 01串,要从中选取若干个不相交子串,使得:
- 所有子串长度加起来为
m - 所有子串拼起来后1的个数占总长的比与原字符串相等. 最小化你选的子串个数.输出方案.
给定一个长
n 01串,q 次询问对于一个区间,若你每次可以删除这个区间的一个01相间子区间(没有00或11),那么最少要删多少次.n,q\le 2\times 10^5
发现自己贪心跟没学一样,完全不会.
题库里筛选greedy,2600,通过人数降序.
给定
1\ldots n 每个数的个数a ,每次给一个区间个数减1或对一个数减去任意,求清空次数.n\le 5000, a_i\le 10^9
"能大力dp的谁贪心啊" --qyc
好像给人感觉很经典.
很能dp,
好吧,贪心就是,每次大力给全局减掉全局最小值,然后全局裂开成若干区间,再递归下去做,如果这么算出来的答案大于区间长度直接变成区间长度(全用单点)
给定一个字符串,可以任意多次删掉末尾字符或者把当前字符串复制一份接在后面,求能得到的字典序最小的,长度恰好为
k 的字符串.n,k\le 5\times 10^5
切不动2200了?!
结论是最优解一定先用删再用复制.考虑我们一定是先删后复制不劣于先复制后删,也就是一个前缀反复复制,做完了.
对所有
k\in [1\ldots n] 求出{1\ldots n} 的大小为k 的子集中最小的值,一个子集的值为这个子集的任选两个不同的数a,b 的\gcd 的最大值.n\le 5\times 10^5
如果不交换是简单的,从第一个开始考虑容易的出限制是
考虑交换两个数
所以我们统计出
哦你发现不对劲,后面不是区间加,因为是给一些位置加上他俩的差,另一些位置减去.
如果我不拍线段树,是不是就是统计一下后缀min之类的结束了啊.
所以为什么是贪心标签呢?
合并了
给定序列
a ,你可以给相邻相等的两个数加1或给任意位置加2,求是否可以若干次操作后让所有位置相同.n\le 2\times 10^5,a_i\le 10^9
看着很想JOI的俄罗斯方块题?但这个不能悬空.
你发现如果
转化回来其实就是若
那么问题就是
你有一个长度为
n 的数组a ,你需要构造一个长度为n 的数组b ,使得a 中每一个元素都能由b 中两个位置不同的元素相加得到.n\le 10^5,a_i\le 10^9
好神奇
特判
如果有一个偶数一定可以:考虑我们只要构造出
于是考虑全是奇数的情况:我们考虑如果最终答案
所以现在要判断是否有两个这样的东西了,众所周知subset sum指数,要点在于当
太脑洞了构造题.
一个塔防游戏:给定一个无限长的数轴,一个无限血的敌人要从正无穷走到负无穷.你的任务是放置三种塔,包含两种攻击塔和一种寒冰塔,使得敌人受到的伤害最大.
其中,每种塔的攻击半径可能不同,每种攻击塔的攻击力也可能不同.而寒冰塔没有攻击力,它的作用是使范围内敌人的速度减速,即一段区间若有
k 个寒冰塔覆盖,敌人速度变为\frac{1}{k+1} .同一个位置只能放两个塔.敌人初始速度为1格每秒,攻击塔的伤害值也是以秒计算的.
三种塔数量总和不超过20.
首先体会一下如果没有一个位置只能放俩的性质,最好的方案是全部堆到一个点上.由这个大概可以想到,最终局面是堆在一起的一排,长度最大为
然后发现安排位置好困难,根本不会,看题解,啥?塔只有20个?/qd
直接枚举冰塔的方案(每个位置放0/1/2个),方案是
现在有一些空位,可以求出每个位置放每种塔的伤害.
此时还不能直接从高往低放...暴力dp它,
我们的问题在于
那么这样dp,省掉一维,然后再枚举前面最长的一段放了多少即可.用set从后往前扫一遍即可.
看一眼另一篇题解,猜完连续的结论后直接模拟退火///jy///jy///jy
给定一个长
n 序列f(A)=\sum_{i=1}^{n-1} \vert a_{i+1}-a_{i} \vert . 区间加,或者给定一个区间和x ,询问给定区间中给一个数加上x 后f(a) 最大是多少.询问独立.n,q\le 10^5,a_i\le 10^9
数据结构题混到greedy.
差分.数组叫
按贡献算,若
于是你准备离线后按
然后你冷静一下想一想,斜率只有
一个不这么野蛮DS的方法是,考虑其实第一种贡献直接出,第二种贡献只要求最小的
给定
x 轴上n 个点和轴外一个点,求从点k 出发把他们全部走一遍(可以重复走)的最短路径长度.n\le 10^5
考虑如果从轴外那个点出发要么从最左走到最右要么从最右走到最左.
于是只要考虑在轴内的情况下了.此时我们的问题是什么时候走那个外面的点不知道.于是直接枚举什么时候过去的然后
给定一棵有根树树,每个边有一个重量和一个硬度,如果一棵树的一条边下面的儿子中的边的重量和大于它的硬度树就寄了,你可以把一条边的硬度和重量减去一个相同的值,但必须保证重量为正整数硬度为整数,求让树不会寄的最大的重量.
n\le 2\times 10^5
性质是一棵子树的重量是一个区间,考虑我们求出最重的那种然后从深度大的开始减是没问题的.主要在于重量最小的一定是从下往上把所有能减的都减掉得到的重量.
考虑dp出所有子树的区间,最小的很显然,最大的大概是考虑在所有子树都最小的基础上还能增加多少重量.
这样求的是最后的最大值.输出方案很烦人,dp时记一下最大/最小的时候这条边减去多少以及当前状态比所有子树都最小的基础上增加了多少.因为一个点的儿子最后的情况一定是若干最小的若干最大的和一个不满的,这个用来算那个不满的.
给定一个每个点度数都是2的二分图,左右两侧点分别标号
[1,n] ,[n+1,2n] ,求对于所有1\le l\le r\le n<n+1\le L\le R\le 2n ,l,r,L,R 四元组,求[l,r],[L,R] 中的点的导出子图的匹配之和.n\le 10^5
突破点在度数是2上.所以每个点都恰好在一个环中,即环互不相交.每个环互不影响.此时一个环贡献的匹配数是环长除以2.
而现在两边各截取出一段,可能有一些环变成了若干个链,但发现链也是互不相交的.分别考虑发现每条链的贡献是长度除以2下取整.
于是这样一个导出子图都答案是
那么因为
给定数轴上
n 个点和m ,要再建立若干点,使得存在一条路径a_1\ldots a_n 的\sum {(a_i-a_{i-1})}^2\le m .求最少再建几个点.n\le 2\times 10^5,a_i\le 10^9
显然可以每一段单独考虑,在这一段里再建
考虑二分每一段收益减到多少我们就不干了,就是说我们给一段不断加点知道它再加的收益小于我们二分的常数
给一个
n\times m 黑白两色的网格图,要全染白,每次把一个连续颜色块反色,求最少次数.n,m\le 50
idea是不是借鉴于拿着油漆桶在画图上一直点的那种感觉.
考虑如果你摁着一个点一直点,这样一层一层下去,到最后一层就完成了.
这个东西等价于把相邻两个点同色连边权为0,不同连1,然后以这个点跑最短路.得到的最远的黑点.
但有没有可能我们不摁着一个点涂色呢?考虑交换所有操作的顺序使得每个涂色都是在涂色点和第一次点的点连通后再做,就和一直按着一个做一样了.一定是可以这么调整的原因在于做这个的时候必然不连通,会相互影响的讨论一下一定是一样的.所以我们一定可以摁着一个点涂色.
于是直接对每个点跑一遍dij或01bfs就结束了.
给定序列
a_{1\ldots n} 和由\texttt{LR} 组成的长n 字符串S ,两个集合L,R 初始为空,要求给一个方案使得我们第i 次选择一个数添加进去后集合S_i 更大.n\le 2\times 10^5,a_i\le 10^9
我们首先考虑一个比较显然的事情,如果
于是考虑在这个基础上,如果我们删掉最大的一个一定会切换,而删掉最小的那个不会切换,且始终保持交错的性质,于是直接倒着做,不断删最大或最小的即可.
给定一个
n 个元素多重集,求最大的子集族使得族内任意两子集没有包含关系.n\le 2\times 10^5
孤陋寡闻,学到了Sperner定理.
在不是多重集的情况下,就是Sperner定理,内容就是对于
那么在是多重集的情况下显然会出问题.考虑其中两个集合
结论是去掉所有重复的之后就是正确答案,还是要锻炼猜结论的能力啊.
如果不知道Sperner定理,应该通过大小相同的不同集合不会互相包含得出选大小相同的构造,然后去猜大小为
然后要统计所有大小为
qyc搬的题 有两只队伍滚榜,已知他们封榜前的过题数和罚时,也知道封榜之后的过的
n 个题和对应罚时,要求一个滚榜顺序使得第一名变化次数最多.
贪心,结论是把两只队伍的罚时一个从小到大一个从大到小排序,然后模拟///jy
怎么回事呢?可以考虑这个结论在一开始没有过题和罚时的情况下一次一换的.
有
n 个数列a ,求数列b ,使得\sum a_ib_i-\max a_ib_i 最大. 多测,n\le 20 ,\sum n\le 10000
看一眼样例,第一个样例是直接给最大和次大的
于是直接猜这个,过了前两个第三个寄了.
又想一想这个东西是线性规划,不会写单纯形,于是一个假单纯形上去TLE30.
原来是贪心,如果我们分配的时候最大值
然后你发现,在不止一个最大的
所以我们最后的样子是有若干个相同的数.且对应的
那么只要枚举选前几大再解个小方程即可.
合并了
给定一个
n\times m 01网格,你可以进行4个操作,将其变全0:
- 翻转一个包含
(1,1) 的矩形- 翻转一个包含
(n,1) 的矩形- 翻转一个包含
(1,m) 的矩形- 翻转一个包含
(n,m) 的矩形 求最小代价.
四个操作代价分别为
1,2,4,3 .
可以证明2,3操作绝对不会用,因为可以被替代为两次1操作.
对于4操作是4次1操作,所以有可能用到4,但3次1操作的效果是4的效果再翻转全局,所以可以认为4操作只会用一次,如果用两次就可以都替换成3次1操作.
因为矩形操作比较复杂,考虑差分.若原网格为
而对于4操作,变成4次单点修改,那么只要枚举4操作操作在哪,剩下全用1操作即可.复杂度
四个操作代价分别为
1,3,4,2 .
2,3操作仍然是来充数的.
但现在4操作可能被用多次了,需要再分析:
1. 设4操作翻转
因为这样4个单点修改中有两个被翻转两次抵消了,所以实际上只修改了两个,可以用1操作代替.
2. 仅当4操作的单点修改中除了点
如果有2个,翻完还要再搭一次操作1,那么反而比直接1更糟糕.
在此基础上我们希望4操作尽可能多,那么我们算整张网络最多进行多少次,发现是一个二分图匹配:每一行列建点,对于满足要求2的4操作
剩下的每一个用一个1操作即可.复杂度
给定平面上
n 个点和\texttt{LR} 构成的长n-2 的字符串,求一条不自交路径经过每一个点一次,且第i+1 个点是在i-1 到i 的基础上忘s_i (左或右)的方向拐的.n\le 2000
好厉害构造题.
任选一个凸包上的点,如果下一次是
原因是,考虑一开始在凸包上,那么若下一次是在左边,我们向右转到的点无论到哪个剩下的点都是往左转的且不会自交,因为当前点到下一个点的连线一定在剩下所有点的一侧.
简单题
在游戏中,有
n 个排列在环上的房间,第i 个房间只能到达第i+1 个房间(特别地,第n 个房间只能到达第1 个房间).同时有
n 个宝箱,第i 个宝箱的价值是c_i ,其中恰好有k 个宝箱是假宝箱,其余均为真宝箱,每个房间有且仅放置一个宝箱.玩家等概率地从
n 个房间中选取一个房间开始移动,如果当前房间有真宝箱,他将获得此宝箱的价值,否则立刻结束游戏.最后获得的总收益等于之前收集的宝箱的总价值.对于每一个
k\in[1,n] ,你可以决定宝箱的排列顺序和宝箱的真假,使玩家收益的期望值最小,请求出最小的期望值\pmod {998244353} .n\le 3\times 10^5
首先把最大的
然后假的把真的分成若干段,对于每一段显然是递减的.
然后再考虑一下会发现平均分配好过不平均分配.
然后再考虑一下发现不仅每一段递减,实际上递减顺序是,每一段第一个>每一段第二个...,于是直接顺着放即可.
给定常数
c 和n 个整数,每个数只能用一次,求加到c 的一个方案.求法是每次选择不超过c 的最大的加进去,那么现在让你再添加任意多个数hack它,或者判断hack不掉,最小化添加的数的和.n,c\le 2\times 10^5
首先,实际上只会添加一个数(套路)
考虑如果添加两个数
于是只要判断添加谁就好了.添加的数一定大于当前小于
给定两个
n\times m 的矩阵A ,B ,每次可以选则一列作为关键字把所有行稳定排序,问是否能通过至多5000次操作把A 变成B .n,m\le 1500
考虑排序过程实际是指定了第一关键字第二关键字...这样的.
考虑最后一次排一定在
于是相当于,如果我们选择按照这个排了序,那么所有满足这个条件的排序都可以在其前面选择,这就很厉害的转化成了一个拓扑排序的结构,于是我们把一开始的顺序记录到新的一列上,这样遍历完这个DAG之后看最后是否能选这个新的一列就能判断是否有解,从这个开始倒着往回走就能输出方案,复杂度
给定两个
2\times n 01矩阵a ,b ,每次交换a 中相邻两个数,问让a 变到b 的最少步数.n\le 2\times 10^5
先考虑只有一行的情况,发现我们可以对每一个相邻对的交换次数分别计算,设
那么现在有了第二行前缀和加上一维0/1表示行,考虑如果对于一个位置,
重点在于这样一种运行到后面我们再考虑一开始是不是换一下这种思想?
给定一个括号序列,每次可以翻转一个区间,求最少的操作次数使得括号串合法.保证左右括号数量相等.
n\le 2\times 10^5
考虑画出折线图,那么一次翻转是把一个区间的折线中心对称.要让折线对称后全在x轴上方,则设最高点值为
于是用之前经典套路是只会进行一两次,发现如果整个序列有一个非常非常高的你可能一次干不掉,但以这个为端点左右两次一定都没问题所以最多只会进行两次.
此时怎么构造也显然了.
多次询问,每次切换棋盘上一个位置是否有棋子. $n,q\le 10^5
首先你想一想发现棋子
不想动脑子,于是直接
然后动动脑子,发现自己是智障这其实是最大后缀和/kx
问是否存在唯一一个
1 \ldots n 的排列c ,满足a_i \leq c_i \leq b_i n\le 2\times 10^5
简单题?
考虑从最小的往大考虑,显然你会选左端点最小的并且此时右端点最小的一定不劣,然后再往上加一,反正每次选能选的里面右端点最小的,就是一个合法方案.
那么如何判断方案是否唯一呢?
如果有两个区间一致,显然有第二小的,于是考虑互不相同的.
那么如果方案不唯一,至少有两个方案,那么就是说我们过程中有一次,不选右端点最小的也成,比如选第二小的,那么以后最优策略仍然是选最小的,那么我们下一个数一定选刚才没选的那个,接下来情况相同,所以我们交换了两个数,所以若方案不唯一,我们最终一定可以交换值域上两个数得到第二个构造.
于是对于每一个元素,考虑若交换的会怎样,就是统计序列中有多少个满足另一个元素在当前这个区间并且当前这个区间包含另一个元素的,这是个静态三维数点,2log.
然后你想一想,其实可能没必要这么多限制,假设我们枚举的是大的那个数,那么另一个数只要满足小于大的并且另一个数的限制右端点不小于当前数,就只有两维了.1log.
给定
n 个英文字母(大写小写)字符串,每个字符在每个字符串最多出现2次,求最长公共子序列.n\le 10 . 多组询问,t\le 5
考虑每个字符最多出现一次的情况,此时字符与位置一一对应,
现在每个字符可以出现两次,当我们仍想这么干的时候不知道
你发现,对于每一个
字符集被分成集合
V 和C ,给定m 个限制和一个给定的字符串,求满足限制,长度为n ,字典序大于给定字符串的最小字符串,每个限制是如果第i 个位置属于A ,则第j 个位置属于B .
首先还能比这个限制更2sat提示的吗,认准为2sat.要考虑如何解这东西了,基本上就是贪心,从前往后每一位选择可能都最小的.此时在满足2sat的基础上仍然可能有一种情况是,如果这个位置选了一个啥,后面虽然有解但可能不满足字典序要求.但200的话,是不是暴力验证就好了啊.
给定长
n 的数组a ,对每一个a_i ,可以选择一个包含它的区间并将区间排序,设它排序后的位置是x ,与区间[l,r] 的中心\lceil \dfrac{l+r}{2}\rceil 为y ,则它的奇异值是最大的\vert x-y\vert . 对每个数求出它的奇异值.n\le 2\times 10^5
比较简单?
先去掉绝对值分正负分别考虑,现在考虑
排完序后它是第几个取决于小于它的数的个数
于是考虑把小于当前数的设为1,其他的都设为0,由于再减去一半的区间长度所以每一个都再减去
于是就是求包含当前节点的最长子段和,线段树维护一下即可.
然后因为每个都要求一遍所以要排序后加
考虑对一个
你要走过
n 块的地,每一块可以是水,岩浆,或土地,并且长l_i 个单位长度,你可以在水上游泳或飞,在岩浆上飞,在土地上走或飞,走一个单位长度用5s,游泳3s,飞用1s,初始时你有0个体力,走一个或游一个单位长度会加1,飞一个会减1,体力显然不能为负,求走过这n 段路的最小时间.n\le 10^5
首先在水上游在土地上走在岩浆上飞,得到一个答案,此时可能到了一个地方飞不过去要往回走,我们看如果前面有过水就游着攒(总可以在第一个水攒够再走),否则就走着攒.
然后会剩下不少能量,先让这些能量代替走的,再代替飞的即可.但有情况使得有土地但你不能把能量加上去如
一些类似费用提前延后计算的技巧吧.
给定
n 个元素的可重集A ,元素在[1,m] 间,每次可以把x 删掉添加p,q 满足pq=x .求任意操作后集合的极差的最小值.n\le 10\times 10^6 \sum n\le 10^6,\sum m\le 5\times 10^6
可以枚举掉一个端点,比如我们现在求固定最小值的最大值最小.
那么我们要把所有大于最小值的都拆成不小于最小值的值.
设
那么如何求得变化后变成啥了呢?正着转移有点困难考虑从
就结束了.
给出
n 个链分别长为l_1\ldots l_n ,和一个只有一个节点的树,每次可以添加一条边把一个链接到树上并且这条边的两个顶点变黑,可以进行任意次操作,最小化操作完后第k 近的白点到根的距离.不一定要把所有链都接上.n\le 2\times 10^5,l_i\le 2\times 10^5,k\le 10^9
考虑每次挂链显然一定挑重心挂.
另外我们一定从长往短挂,考虑如果先放了短的再放长的,则最大深度是长链长度一半加一,但先放短的就只是长链一半,所以排完序之后依次加入.
那么如何维护往上挂的这个操作呢?考虑我们并不关心树的结构,那么直接开个线段树维护每个深度点的个数支持区间加单点加即可.
同时因为我们挂点一定是从深度小往深度大的挂,所以可以用差分实现,因为我们一定是按顺序的,所以可以一边累加一边做.
有
n 波怪物,你有一把枪,枪的弹夹量为k ,第i 波怪物数量为a_i ,在第l_i 到r_i 时间出现(r_i<=l_{i+1} ),你可以在任意时刻打出一发子弹击杀一只怪物且不耗费时间,你必须在[l_i, r_i] 时间内消灭a_i 只怪物,你每次换弹都需要将弹夹(包括里面的子弹)扔掉,并花费 1 单位的时间,在尽量保证通关的情况下,需要的最少的子弹数为多少.n\le 2000,k\le 10^9
看起来似乎很简单啊,这个
直接dp,
你体会一下发现
然后看一眼题解,发现这题可以线性,说的是,考虑我们一定是再不换弹就死了都时候才换弹.
给定长度为
n 的颜色序列a_i ,每次可以选择任意一个颜色全部相等的区间染成另一种颜色,求全都染成一种的最小代价.\sum n\le 3000
这个题和前面那个黑白格子二维染色的有点像,但颜色多了,没有一直在一个地方做的性质了.
但数据范围很小,区间dp它,
想一想是否每一种操作都被包含进去了发现是的.
山的初始攀登难度为 $d$ . 每位登山者有两个属性:技巧 $s$ 和整洁度 $a$ . 技巧为 $s$ 的登山者能登上攀登难度为 $p$ 的山当且仅当 $p\leq s$ . 在一位整洁度为 $a$ 的登山者登上攀登难度为 $p$ 的山后,山的攀登难度会变为 $\max(p,a)$ . 请给这些登山者指定一个爬山的先后顺序,最大化登上山的人数. 如果轮到一位登山者时他能登上山,则他一定会选择登山. $n\le 5\times 10^5,d,s_i,a_i\le 10^9
建图,若
然后你考虑一下,发现这个最长路要求每个点只经过一次,因为有正环///fn
正确做法是直接贪心,按照
证明它,当前山高度为
思路似乎很不自然啊,实际上呢?邻项交换///fn
考虑相邻两项
如果
如果
如果
...
然后就得到结论了/kx
好像是咱们上面那个 Teleporters 啊.凸的-二分就做完了.
给定
n 个长m 的序列a_i ,每个序列有权值w ,求最小的w_i+w_j 满足a_i,a_j 的交集为空.n\le 10^5,m\le 5
这个有点神仙?
首先可以双指针:把
那么现在都问题是我们啥时候应该左移,那就是如果区间
如果等于1则没有重复元素,否则有.还挺显然,考虑
这个方法的关键之处在于我们可以判断一个集合与一个堆的集合是否都有交,因为我们只要枚举这一个集合的子集,判断出现次数即可.
另外一种办法是用bitset莽
给定长
n 的数组a 和一个数s ,构造一个森林,每个点i 有非负点权c_i ,要求点i 的子树中点权之和恰好为a_i ,并且所有点权的和为s .输出答案时,对于每个
i ,先输出c_i ,再输出k_i 表示i 的儿子数量,然后依次输出i 的儿子们.无解输出-1.n,s\le 70000
首先你一眼看出森林的每一棵树应该都是一条链,就直接构造完了.
于是现在问题是哪些节点当根,因为它们的
于是要找到若干个数和
一棵树,
i 的父亲是i 最大的非自身的因数,给定n 个k_i! ,求树上一点到这n 个点的距离和最小值.
其实只有5000个点做带权重心(重心经典结论),重点是求出这些点的虚树.于是要知道:
于是求虚树就好了.
给定一个长
n 01串,q 次询问对于一个区间,若你每次可以删除这个区间的一个01相间子区间(没有00或11),那么最少要删多少次.n,q\le 2\times 10^5
考虑区间内的00和11个数:
对于00101010101011这样的,我们要么一次操作删掉一个11一个00(0010101011->01),要么一次删掉一个11或00(00101010100->00)并且只要同时有00和11,一定可以选择同时删掉0011(交界处)于是就统计区间00,11个数,取个max即可.
给定一个字符串
S ,求有多少个与S 等长字符串T ,满足\mathrm{LCS}(S,T)=|S|-1 ,其中S,T 只包含前m 个小写字母.n\le 10^5,m\le 26
首先明显转化为
那么先考虑删掉字符后串相同的情况,发现两个串相同当且仅当删掉的两个字符及它们中间的字符全部相同.
那么考虑此时再插入一个字符的方案,基础情况是除了原位都能插入.但对于一个相同段,向其中插入等于这个相同段的东西,所以贡献是
但发现删掉
另一个做法是dpofdp,直接记录求LCS的一行的状态显然是爆炸的.考虑对于一个状态
那么我们设
再考虑,因为
于是每一位只可能是
题目很好,可为啥是贪心呢?///yw
给定一个字符串,每一个后缀,求可以删去若干个相邻两相同字符的情况下这个后缀最小的字典序.
aabb
可以到空,但abba
不行,就是可以一次选若干个不想交的相邻两个删.|S|\le 10^5
- 所有子串拼起来后1的个数占总长的比与原字符串相等. 最小化你选的子串个数.输出方案.
精妙的.
第一步,设原串有
结论是,把串头尾相接,一定有一个长度为
于是就做完了.
给定长度为
n 的01串s ,构造一个排列使得s_{p_i}\ne s_{p_{i+1}} ,最小化排列的逆序对个数,输出方案.n\le 10^5
相当于选择尽可能少的若干个01交替的子序列.
于是从左往右扫,维护当前已有的所有子序列,看新来的这个是否能添加到其中一个或要新开一个.
然后有可能添加完之后无法拼到一起,比如两个分别是