牛客 糖糖别胡说,我真的不是签到题目(思维+差分)

首先如果一个糖糖被消灭,那么一定是后面的不同组的糖糖的最大值比他要大

因此我们只需要倒着求最大值就行了

问题是发功的解法,发功其实就是给1-ci的数加上1,因此只要先把发功的影响算出来,加到原数组上就可以

因为比如在3处发功,1-3都会+1,所以对相对关系没有影响。只有在3前面的发功才会对3和1的关系产生影响,所以只需要求出最终答案后比大小即可。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],b[N];
int s[N];
int main(){
    int t;
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--){
        memset(s,0,sizeof s);
        int n,m;
        cin>>n>>m;
        int i;
        for(i=1;i<=n;i++){
            cin>>a[i]>>b[i];
        }
        for(i=1;i<=m;i++){
            int x;
            cin>>x;
            s[1]+=1;
            s[x+1]-=1;
        }
        for(i=1;i<=n;i++)
            s[i]+=s[i-1];
        for(i=1;i<=n;i++)
            b[i]+=s[i];
        int max1=0,max2=0;
        if(a[n]==1)
            max1=b[n];
        else
            max2=b[n];
        int res=0;
        for(i=n-1;i>=1;i--){
            if(a[i]==1){
                if(b[i]<max2)
                    res++;
                max1=max(max1,b[i]);
            }
            else{
                if(b[i]<max1)
                    res++;
                max2=max(max2,b[i]);
            }
        }
        cout<<n-res<<endl;
    }
}
View Code
原文地址:https://www.cnblogs.com/ctyakwf/p/12882401.html