题解 | #糖糖别胡说,我真的不是签到题目#

糖糖别胡说,我真的不是签到题目

https://ac.nowcoder.com/acm/problem/14583

可以提前把施法后的b算出来。因为前面的结果会影响后面的判断

#include<bits/stdc++.h>
using namespace std;
int n,m;
const int M=5e4+5;
int a[M],b[M];
int d[M];
int main(){
    int t;
    cin>>t;
    while(t--){
        memset(d,0,sizeof(d));
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            cin>>a[i]>>b[i];
        }
        for(int i=1;i<=m;i++){
            int x; cin>>x;
            d[1]++; d[x+1]--;
        }
        for(int i=1;i<=n;i++){
            d[i]=d[i]+d[i-1];
            b[i]+=d[i];
        }
        int max0=-1; int max1=-1;
        int cnt=0;
        for(int i=n;i>=1;i--){
            if(a[i]==0){
                max0=max(max0,b[i]);
            }
            if(a[i]==1){
                max1=max(max1,b[i]);
            }
            if(a[i]==0&&b[i]>=max1) cnt++;
            if(a[i]==1&&b[i]>=max0) cnt++;
        }
        cout<<cnt<<endl;
    }
    return 0;
}
竞赛奋斗日志 文章被收录于专栏

一个奋斗的蒟蒻

全部评论

相关推荐

05-05 21:45
已编辑
广州大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务