b题

只需要把递增的地方累加起来,最后加上最大值减去最后一点的值即可

ac代码

#include<cstdio>
#include<algorithm>
using namespace std;
int a[100005];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        int ans=0;
        int Max=0;
        a[0]=1e13+1000;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)
        {
            if(a[i]>a[i-1])  ans+=a[i]-a[i-1];
            Max=max(Max,a[i]);
        }
        if(a[n]!=Max) ans+=Max-a[n];
        printf("%d\n",ans);
    }
}

k题

去掉m个字母保持字典序最小

在m未耗尽之前保持双端队列内的字母为递增

最后若m若有剩余 队列内的字母一定是非递减的 只需去掉后m个即可

#include<cstdio>
#include<algorithm>
#include<queue>
#include<string>
#include<iostream>
#include<list>
#include<stack>
#include<deque>
using namespace std;
char tmp[100005];
int main()
{
    //freopen("in.txt","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--)
    {
        deque<char>s;
        int n,m;
        scanf("%d%d",&n,&m);
        scanf("%s",tmp+1);
        for(int i=1; i<=n; i++)
        {
            while(s.size()&&s.back()>tmp[i]&&m>0) s.pop_back(),m--;
            s.push_back(tmp[i]);
        }
        //cout<<m<<endl;
        while(s.size()>m) printf("%c",s.front()),s.pop_front();
        printf("\n");
        if(!s.empty()) s.pop_front();
    }
}