十分钟ak,没啥好说的,反正把我挂了,随便做做。第一题直接判断一下(n+m)的奇偶性就行,代码暂无。第二题:直接分a[i] > b[i] 和 a[i] < b[i] 即可然后贪心一下:#include<bits/stdc++.h>using namespace std;int n;long long a[100005],b[100005];int main(){    cin>>n;    for(int i=1;i<=n;i++){        cin>>a[i];    }    for(int i=1;i<=n;i++){        cin>>b[i];    }    long long res1 = 0;    long long res2 = 0;    for(int i=1;i<=n;i++){        if(a[i] > b[i]){            res1 = res1 + a[i] - b[i];        }        else{            res2 = res2 + b[i] - a[i];        }    }    cout<<max(res1,res2)<<endl;}第三题:二分+差分即可(线段树也可)#include "bits/stdc++.h"using namespace std;long long sub[100005];long long a[100005];int rr[100005],ll[100005];int n,m;bool check(int x){    for(int i=1;i<=n;i++){        sub[i] = 0;    }    for(int i=1;i<=x;i++){        sub[ll[i]] += 1;        sub[rr[i] + 1] -= 1;    }    for(int i=1;i<=n;i++){        sub[i] = sub[i - 1] + sub[i];        if(sub[i] > a[i]) return false;    }    return true;}int main(){    cin>>n>>m;    for(int i=1;i<=n;i++){        cin>>a[i];    }    for(int i=1;i<=m;i++){        cin>>ll[i]>>rr[i];    }    int l = 1;    int r = m;    int ans = 0;    while (l<=r){        int mid = (l+r) >> 1;        if(check(mid)){            ans = mid;            l = mid + 1;        }        else{            r = mid - 1;        }    }    cout<<ans<<endl;}
点赞 4
评论 4
全部评论

相关推荐

投递字节跳动等公司8个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务