【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;
}

这期真的红温了
(以下省略一串脏话)
用一个表情包来表现你现在的心情?
alt text
后半学期,也请各位继续关注:
《我的青春线代物语果然有问题》
《高数女主养成计划》
《程设の旅》
《青春猪头少年不会梦到多智能体吃豆人》
《某Linux的开源软件》
还有——

《我的算法竞赛不可能这么可爱》

本期到此结束!

posted @ 2025-04-25 09:38  elainafan  阅读(28)  评论(0)    收藏  举报