【CF 1020(div.3) D】最红温的一集
啊大好的上分日子,气死我了
改了大半夜的代码,最后发现一个i=1改成i=0就能过?
无语了 直接看题吧
题目描述
花童的花园里有 \(n\) 朵花,可以用整数序列 \(a_1, a_2, \dots, a_n\) 表示,其中 \(a_i\) 是左边第 \(i\) 朵花的美丽程度。
伊戈尔想收集的花朵正好是 \(m\) 朵。为此,他将在花园中从左到右行走,并选择是否采集当前位置的花朵。在他收集的花中,第 \(i\) 朵花的美丽程度必须至少*** \(b_i\) 。
伊戈尔注意到可能无法收集到满足他的美丽要求的 \(m\) 朵花,所以在开始收集花朵之前,他可以选取任意整数 \(k\) ,用魔法棒种出一朵美丽度为 \(k\) 的新花,并把它放在花园的任何地方(两朵花之间、第一朵花之前或最后一朵花之后)。由于他的魔法能力有限,他最多只能这样做1次。
输出最小**整数 \(k\) 伊戈尔在执行上述操作时必须采摘的花朵,以确保他能采到 \(m\) 朵花。如果伊戈尔在不使用操作的情况下可以收集到 \(m\) 朵鲜花,则输出 \(0\) 。如果在使用操作后仍无法收集到 \(m\) 朵鲜花,则输出 \(-1\) 。
输入
输入的第一行包含一个整数 \(t\) \((1 \le t \le 10^4)\) --测试用例的数量。 \((1 \le t \le 10^4)\) - 测试用例数。
每个测试用例的第一行包含两个整数 \(n\) 和 \(m\) --测试用例的数量。 \((1 \le m \le n \le 2 \cdot 10^5)\) --分别是花园中的花朵数量和伊戈尔想要收集的花朵数量。
每个测试用例的第二行包含 \(n\) 个整数 \(a_1, a_2, ..., a_n\) 。 \((1 \le a_i \le 10^9)\) - 其中, \(a_i\) 是花园中左边第 \(i\) 朵花的美丽程度。
每个测试用例的第三行包含 \(m\) 个整数 \(b_1, b_2, ..., b_m\) 。 \((1 \le b_i \le 10^9)\) - 其中 \(b_i\) 是伊戈尔要收集的第 \(i\) 朵花的最小美度。
可以保证所有测试用例中 \(n\) 的总和不超过 \(2 \cdot 10^5\) 。
输出
针对每个测试用例,另起一行,输出最小整数 \(k\) 伊戈尔在执行上述操作时必须摘取的整数,以确保他能收集到 \(m\) 朵花。如果伊戈尔可以在不使用操作的情况下收集到 \(m\) 朵花,则输出 \(0\) 。如果在执行操作后仍无法采集到 \(m\) 朵鲜花,则输出 \(-1\) 。
样例输入
7
9 5
3 5 2 3 3 5 8 1 2
4 6 2 4 6
6 3
1 2 6 8 2 1
5 4 3
5 3
4 3 5 4 3
7 4 5
6 3
8 4 2 1 2 5
6 1 4
5 5
1 2 3 4 5
5 4 3 2 1
6 3
1 2 3 4 5 6
9 8 7
5 5
7 7 6 7 7
7 7 7 7 7
样例输出
6
3
7
0
-1
-1
7
提示
在第一个测试案例中,假设伊戈尔种植了一朵美丽的花 \(6\) ,并把它放在第三朵花和第四朵花之间。那么,花园就会变成下面的样子: \([3, 5, 2, 6, 3, 3, 5, 8, 1, 2]\) .然后,他可以选择第二、第四、第六、第七和第八朵美丽的花朵 \([5, 6, 3, 5, 8]\) 。
在第三个测试案例中,他可以种植一朵美丽的花朵 \(7\) ,并把它放在第一朵花朵之前。花园就会变成下面的样子: \([7, 4, 3, 5, 4, 3]\) .现在,他可以选择第一朵、第二朵和第四朵花。
在第四个测试用例中,伊戈尔不需要使用运算,因此答案为 \(0\) 。
在第六个测试案例中,无论伊戈尔如何进行运算,他都无法收集到 \(3\) 朵花,使得他收集到的 \(i\) (朵)花的美度至少为 \(b_i\) ,因此答案为 \(-1\) 。
Solution
这次就直接写Solution了,因为确实太红温了
跟上回的C很像,就是维护前后缀
然后如果一个点\(i\)的pre和suf为m-1,说明需要选取\(b[pre[i]+1]\)作为最小值的候选
如果不存在这样的点就是-1
一开始先判断一下0的情况
注意
可能需要选取第1朵花 而如果\(suf[1]\)就是\(m-1\)的话,可能会出现错选 所以我们需要从\(i=0\)开始遍历
下面看代码:
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;
int t;
int main(){
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
vector<int>a(n+5,0);
vector<int>b(m+5,0);
vector<int>pre(n+5,0);
vector<int>suf(n+5,0);
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
cin>>b[i];
}
b[m+1]=1e9+5;
int l=1;
for(int i=1;i<=n;i++){
if(a[i]>=b[l]){
l++;
}
if(l==m+1) break;
}
if(l==m+1){
cout<<0<<endl;
continue;
}
l=1;
for(int i=1;i<=n;i++){
if(a[i]>=b[l]){
pre[i]=l;
l++;
}
else{
pre[i]=pre[i-1];
}
}
l=m;
suf[n+1]=0;
for(int i=n;i>=1;i--){
if(a[i]>=b[l]){
suf[i]=m+1-l;
l--;
}
else{
suf[i]=suf[i+1];
}
}
int temp=1e9+5;
for(int i=0;i<=n;i++){
if(pre[i]+suf[i+1]==m-1){
temp=min(temp,b[pre[i]+1]);
}
}
if(temp==1e9+5) cout<<-1<<endl;
else cout<<temp<<endl;
}
return 0;
}
这期真的红温了
(以下省略一串脏话)
用一个表情包来表现你现在的心情?

后半学期,也请各位继续关注:
《我的青春线代物语果然有问题》
《高数女主养成计划》
《程设の旅》
《青春猪头少年不会梦到多智能体吃豆人》
《某Linux的开源软件》
还有——
《我的算法竞赛不可能这么可爱》
本期到此结束!

浙公网安备 33010602011771号